next

从0开始搭建数据仓库(2):产品经理如何“玩转”Hive SQL

自闭症网瘾萝莉.ら 提交于 2021-01-16 15:03:07
作者介绍 莲石东路@乌森 心之所向,***成长。从底层架构到应用实战,聊聊炼数成金背后的故事。 持续更新数据治理、数据科学、数据可视化、空间计算系列文章。 01 前言 公司新入职了的产品经理小美因为业务需要,想搭一个数据大屏方便自己查看数据。她找开发小王申请了数仓权限,然后从技术中台里找到了数据大屏的工具,把自己平时查数据用的sql搬上去跑,结果总是报错。 小美找到了做数据产品经理的师兄小帅看了看。 小帅:你这个查询有问题,业务系统的sql不能直接搬来用。 小美:我看长得差不多啊,除了多了个分区外,不都是sql吗? 小帅:你现在建的是Hive查询,Hive SQL虽说和SQL非常相似,但是一些细节上还是有区别的。 02 Hive SQL是什么? Hive是大数据领域常用的数据仓库组件,可以借助查询语言SQl将HDFS上存储的结构化文件映射成一张数据库表,并提供类SQL查询功能。Hive-SQL就是这个”类SQL查询功能”。Hive-SQL与SQL基本上一样,因为当初的设计目的,就是让会SQL不会编程MapReduce的也能完成处理数据工作。 【拓展】Hive-SQL是如何转化为MapReduce任务的呢?整个编译过程分为六个阶段: 1) Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 2) 遍历AST Tree

Python习题集

假如想象 提交于 2021-01-16 08:33:57
【习题】 【 1 】 汉诺塔的移动 【 2 】 自定义 strip 方法 【 3 】 打印前 n 个斐波那契数列的值 【 4 】 打印杨辉三角 【 5 】 使用 reduce 和 map 重新定义函数 float( ) 【 6 】 打印所有素数 【 7 】 将 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] 排序 【 8 】 设计一个 decorator ,使它能作用于任何函数,并打印出函数执行的时间 【 9 】 将题【 8 】中的装饰器作用于一个打印素数的函数,要求输入素数的最大值 【 10 】 将题目改造成 class 【 11 】 让用户输入名字,再次运行程序后仍可对用户表示欢迎 ( 并确定用户是否为上次运行该程序的用户 ) 【课外练习】 【 1 】 定义阶乘函数 【 2 】 记由 1 , 2 , 3 , 4 组成的三位数为 x ,写出所有无重复数字的 x 【 3 】 一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 也就是,x 为整数, n1,n2 也为整数 , , 【 4 】 打印九九乘法表 【 5 】 求 101 到 200 之间的所有素数及个数 【 6 】 将一个正整数分解质因数 【 7 】 输入一个成绩,符合 {'A': >= 90 丨 'B':

Vue elementUi input查询、el-table数据表 、el-pagination分页的使用

独自空忆成欢 提交于 2021-01-16 06:38:11
<template> <div> <el-input v-model="input" placeholder="请输入关键字"></el-input> <el-table ref="multipleTable" :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55"></el-table-column> <el-table-column label="日期" width="120"> <template slot-scope="scope">{{ scope.row.date }}</template> </el-table-column> <el-table-column prop="name" label="姓名" width="120"></el-table-column> <el-table-column prop="address" label="地址" show-overflow-tooltip></el-table

vue 前端分页(el-pagination)展示数据

本秂侑毒 提交于 2021-01-16 05:43:24
文章来源 : https://www.cnblogs.com/fengpingfan/p/9811330.html 在web开发过程中,通常使用表格展示数据,在数据较多时采用分页的方式展示给用户。 分页方式有前端假分页和后端分页两种实现方式,此文仅记录前端假分页实现方式。 第一步:添加分页组件(el-pagination)在表格下方,添加的代码如下所示: <template> <el-table> ... </el-table> <el- pagination @size -change="handleSizeChange" @current -change="handleCurrentChange" :current -page="currentPage" :page -sizes="[15, 30, 50, 100]" :page -size="pageSize" layout ="total, sizes, prev, pager, next, jumper" :total ="currentTotal"> </el-pagination> </template> <script> ... </script> 第二步:添加分页所需的变量,如下所示: <script> export default { methods: { ... }, data() { return {

ASP.NET CORE 项目实战 ---图形验证码的实现

僤鯓⒐⒋嵵緔 提交于 2021-01-16 04:37:34
简介      很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中试用,但是很多东西也是出于自己理解的肤浅和技术的不断更新,经常变动,所以,如果自己还没有完全搞好,就来写博客,反复的修正,可能会误导一些新手朋友。   如果有正在研究Core的朋友,可以大家一起交流下。 验证码         相信很多朋友跟我一样,图形验证码成为了 Core 的一个绊脚石。   System.Drawing.Primitives 这是官方的一个Drawing库,但是没有Bitmap、Graphics等很多东西,所以这个做图形验证码基本Pass了。   CoreCompat.System.Drawing 这个是一个第三方的, 使用了mono的System.Drawing实现,只要安装了之前使用System.Drawing的代码完全不用修改,也支持描画验证码等描画类的功能。 如果需要linux或osx支持,可以安装runtime.linux.CoreCompat.System.Drawing和runtime.osx.10.10-x64.CoreCompat.System.Drawing。(地址: https://github.com/CoreCompat/CoreCompat ),基本大家都是在用这个吧

Java 迭代接口:Iterator、ListIterator 和 Spliterator

£可爱£侵袭症+ 提交于 2021-01-15 19:10:51
1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素, Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它。例如,你如果要删除循环中的元素,那么 for 循环不见得总是可行的。 结合自定义的迭代器,我们可以迭代更为复杂的对象,以及向前和向后移动,并且知晓如何利用其优势也将变得非常清楚。 本文将深入讨论如何使用 Iterator 和 Iterable 接口。 2. Iterator() Iterator 接口用于迭代集合中的元素( List , Set 或 Map )。它用于逐个检索元素,并在需要时针对每个元素执行操作。 下面是用于遍历集合与执行操作的方法: .hasNext() :如果还没有到达集合的末尾,则返回 true ,否则返回 false .next() :返回集合中的下一个元素 .remove() :从集合中移除迭代器返回的最后一个元素 .forEachRemaining() :按顺序为集合中剩下的每个元素执行给定的操作 首先,由于迭代器是用于集合的,让我们做一个简单的包含几个元素的 ArrayList : List<string> avengers = new ArrayList<>(); // Now lets add some Avengers to the list avengers.add("Ant

单链表的创建(头插法和尾插法)

巧了我就是萌 提交于 2021-01-15 13:12:55
单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点。这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置。尾插法是不断地向插入的新元素之后再插入新的元素。需要注意的是头插法必须初始化头结点,使得头结点的指针域指向NULL,即p->next=NULL,详细请看代码: #include <iostream> #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //单链表定义(结构体) typedef struct LNode{ int data;//数据域 struct LNode *next;//指针域 }LNode,*LinkList; //初始化单链表(不带头结点) /* bool InitList(LinkList &L){ L = NULL;//将单链表初始化为空表 return true; } */ //初始化单链表(带头结点) bool InitList(LinkList &L){ L = (LNode *)malloc(sizeof(LNode));//分配一个头结点,并且用L指针变量指向这个头结点 if(L=

java之常用API

大兔子大兔子 提交于 2021-01-15 07:38:17
1 Scanner类 1.1 API的概述 API (Application Program Interface):应用程序接口;是Java提供很多类和接口以来帮助我们编程。我们在拿到一个API文档的时候,第一个要看包路径;第二看构造方法;第三看方法摘要。 1.2 引用类型的使用步骤 功能:可以实现键盘输入数据。 引用类型的一般使用步骤:( 除了基本数据类型,都是引用类型 ,所以scanner也是一个引用类型) (1 )导包 import 包路径.包名称; 特殊情况:在java的API中,只有 java.lang包下的内容不需要导包 ,可以直接使用;比如String类。 ( 2 )创建 类名称 对象名 = new 类名称(); ( 3 )使用 对象名.成员方法名(); 1.3 Scanner类的使用步骤 package com.yc.page4; import java.util.Scanner; // 1.导包 public class ScannerDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //2、创建 int num= sc.nextInt(); //3、使用 System.out.println( "输入的是"+num); // 输入数字

Java 常用API

五迷三道 提交于 2021-01-15 07:37:50
常用api第一部分 String 类 双引号字符串,都是 String 类的对象 字符串的特点: 字符串的内容永不可变(正是因为字符串不可改变,所以字符串是可以共享使用的) 字符串效果上相当于是 char[] 字符数组,但是底层原理是 byte[] 字节数组 字符串的常见的 3 + 1 种创建方式 public class DemoString { public static void main(String[] args) { // 最简单的方式创建一个字符串 String str = "johny" ; // 使用空参构建 String str1 = new String(); System.out.println(str1); // "" // 根据字符数组的内容,来创建对应的字符串 char [] charArray = {'A', 'B', 'C' }; String str2 = new String(charArray); System.out.println(str2); // "ABC" // 根据字节数组的内容,来创建对应的字符串 byte [] byteArray = {97, 98, 99 }; String str3 = new String(byteArray); System.out.println(str3); // "abc" } } 字符串常量池

python 生成器、生成器函数、推导式、生成器表达式

老子叫甜甜 提交于 2021-01-15 06:21:12
一、生成器    生成器的本质就是迭代器    生成器的特点和迭代器一样,取值方式和迭代器一样。(__next__(),send():给上一个yield传值)    生成器一般由生成器函数或者生成器表达是来创建 二、生成器函数    和普通函数没有区别。里面yield 的函数就是生成器函数    生成器函数在执行的时候,默认不会执行函数体,返回生成器    通过生成器的__next__() 分段执行这个函数 def fun(): print("aaaa") yield 1 #返回数据 print("bbbb") yield 2 gen = fun() #拿到生成器 gen.__next__() #执行函数,执行到下一个yield gen.__next__() #继续执行,执行到下一个yield   send() 给上一个yield 传值,不能在开头(没有上一个yield),最后一个yield也不能用send() def eat(): print("菜单") a = yield "馒头" print('a=',a) b = yield "鸡蛋灌饼" print('b=', b) c = yield "手抓饼" print('c=',c) yield 'end' gen =eat() ret1 = gen.__next__() print(ret1) ret2 = gen.send(