hive split 如何split 取最后一个个分隔符

分布式集群/Hadoop(39)
hive 默认的字段分隔符为ascii码的控制符\001,建表的时候用fields terminated by '\001',如果要测试的话,造数据在vi 打开文件里面,用ctrl+v然后再ctrl+a可以输入这个控制符\001。按顺序,\002的输入方式为ctrl+v,ctrl+b。以此类推。
控制符在java代码中如何输入呢?采用如下方式:
&byte[]&bytes&=&new&byte[]&{5};
String&sendString=new&String(&&bytes&,&GBK&);&
这样可以输入控制符\005。
public String[] split(String regex,
int limit)
Splits this string around matches of the given regular expression.
The array returned by this method contains each substring of this string that is terminated by another substring
that matches the given expression or is terminated by the end of the string.
The substrings in the array are in the order in which they occur in this string.
If the expression does not match any part of the input then the resulting array has just one element, namely this string.
The limit parameter controls the number of times the pattern is applied and therefore affects the length of the resulting array.
If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n,
and the array's last entry will contain all input beyond the last matched delimiter.
If n is non-positive then the pattern will be applied as many times as possible and the array can have any length.
If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.
The string &boo:and:foo&, for example, yields the following results with these parameters:
{ &boo&, &and:foo& }
{ &boo&, &and&, &foo& }
{ &boo&, &and&, &foo& }
{ &b&, &&, &:and:f&, &&, && }
{ &b&, &&, &:and:f&, &&, && }
{ &b&, &&, &:and:f& }
参考链接:
/questions/1635764/string-parsing-in-java-with-delimeter-tab-t-using-split
/link?url=kSHmhRmwFMEsqlNfz3AIjlNdAX_zufuZEQCJ0zcecgACwn0yn-TFvnPv5FAROnC6LeOUK3TQgdEbjdDDYKise_
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:67420次
积分:1821
积分:1821
排名:第16344名
原创:105篇
转载:62篇
评论:14条
(1)(19)(2)(3)(1)(6)(11)(10)(24)(2)(5)(14)(5)(2)(9)(2)(8)(15)(7)(15)(1)(6)转义字符引发的血案(hive、bash)
hive hql:从一个字符串&p?a?b?c?ppp?hhh&中以?作为分隔符,找第5段字符串
bash程序:
#!/bin/bash&
hive -e &select (split('p?a?b?c?ppp?hhh','?'))[4]& from a limit 1;&&
Caused by: java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
#!/bin/bash&
hive -e &select (split('p?a?b?c?ppp?hhh','\\\\?'))[4]& from a limit 1;&&
正确运行原因:&
split的第二个参数是一个regex,而&?&有特殊的意义(? 零次或一次匹配前面的字符或子表达式),因此需要被转义。
在hive中,'\'本身就代表转义字符,因此'\'需要被转义
在bash中,'\'本身就代表转义字符,因此'\'需要被转义
正则表达式需要转义的特殊字符
注释 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,那么 $ 还匹配 \n 或 \r 前面的位置。若要匹配 $ 字符本身,请使用 \$。
( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。若要匹配这两个字符,请使用 \( 和 \)。
* 零次或多次匹配前面的字符或子表达式。若要匹配 * 字符,请使用 \*。
+ 一次或多次匹配前面的字符或子表达式。若要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单个字符。若要匹配 .,请使用 \。 [ ] 标记中括号表达式的开始。若要匹配这些字符,请使用 \[ 和 \]。
? 零次或一次匹配前面的字符或子表达式,或指示&非贪心&限定符。若要匹配 ? 字符,请使用 \?。
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,字符 n 匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \,序列 \( 匹配 (。
/ 表示文本正则表达式的开始或结束。若要匹配 / 字符,请使用 \/。
^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。若要匹配 ^ 字符本身,请使用 \^。
{ } 标记限定符表达式的开始。若要匹配这些字符,请使用 \{ 和 \}。
| 指出在两个项之间进行选择。若要匹配 | ,请使用 \|
bash转义字符表
\a&&&&&&&&&&& ASCII 响铃字符(也可以键入 \007)
\d&&&&&&&&&&& &Wed Sep 06& 格式的日期
\e&&&&&&&&&&& ASCII 转义字符(也可以键入 \033)
\h&&&&&&&&&&& 主机名的第一部分(如 &mybox&)
\H&&&&&&&&&&& 主机的全称(如 &&)
\j&&&&&&&&&&& 在此 shell 中通过按 ^Z 挂起的进程数
\l&&&&&&&&&&& 此 shell 的终端设备名(如 &ttyp4&)
\n&&&&&&&&&&& 换行符
\r&&&&&&&&&&& 回车符
\s&&&&&&&&&&& shell 的名称(如 &bash&)
\t&&&&&&&&&&& 24 小时制时间(如 &23:01:01&)
\T&&&&&&&&&&& 12 小时制时间(如 &11:01:01&)
\@&&&&&&&&&&& 带有 am/pm 的 12 小时制时间
\u&&&&&&&&&&& 用户名
\v&&&&&&&&&&& bash 的版本(如 2.04)
\V&&&&&&&&&&& Bash 版本(包括补丁级别)
\w&&&&&&&&&&& 当前工作目录(如 &/home/drobbins&)
\W&&&&&&&&&&& 当前工作目录的&基名 (basename)&(如 &drobbins&)
\!&&&&&&&&&&& 当前命令在历史缓冲区中的位置
\#&&&&&&&&&&& 命令编号(只要您键入内容,它就会在每次提示时累加)
\$&&&&&&&&&&& 如果您不是超级用户 (root),则插入一个 &$&;如果您是超级用户,则显示一个 &#&
\xxx&&&&&&&&&&& 插入一个用三位数 xxx(用零代替未使用的数字,如 &\007&)表示的 ASCII 字符
\\&&&&&&&&&&& 反斜杠
\[&&&&&&&&&&& 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。
\]&&&&&&&&&&& 这个序列应该出现在非打印字符序列之后。
reference:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Hive常用字符串函数 – 过往记忆
欢迎关注Hadoop、Spark、FlinkHive、Hbase、Flume等大数据资料分享微信公共账号:iteblog_hadoop。
文章总数:709
浏览总数:7,889,641
评论:4272
分类目录:83 个
注册用户数:1885
最后更新:日
欢迎关注微信公共帐号:iteblog_hadoop
IT技术前沿:geek_toutiao
  内部提供了很多操作字符串的相关函数,本文将对其中部分常用的函数进行介绍。
下表为内置的字符串函数,具体的用法可以参见本文的下半部分。
ascii(string str)
返回str第一个字符串的数值
base64(binary bin)
将二进制参数转换为base64字符串
concat(string|binary A, string|binary B...)
返回将A和B按顺序连接在一起的字符串,如:concat('foo', 'bar') 返回'foobar'
array&struct&string,double&&
context_ngrams(array&array&string&&, array&string&, int K, int pf)
从一组标记化的句子中返回前k个文本
concat_ws(string SEP, string A, string B...)
类似concat() ,但使用自定义的分隔符SEP
concat_ws(string SEP, array&string&)
类似concat_ws() ,但参数为字符串数组
decode(binary bin, string charset)
使用指定的字符集将第一个参数解码为字符串,如果任何一个参数为null,返回null。可选字符集为: 'US_ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'
encode(string src, string charset)
使用指定的字符集将第一个参数编码为binary ,如果任一参数为null,返回null
find_in_set(string str, string strList)
返回str在strList中第一次出现的位置,strList为用逗号分隔的字符串,如果str包含逗号则返回0,若任何参数为null,返回null。如: find_in_set('ab', 'abc,b,ab,c,def') 返回3
format_number(number x, int d)
将数字x格式化为'#,###,###.##',四舍五入为d位小数位,将结果做为字符串返回。如果d=0,结果不包含小数点或小数部分
get_json_object(string json_string, string path)
从基于json path的json字符串中提取json对象,返回json对象的json字符串,如果输入的json字符串无效返回null。Json 路径只能有数字、字母和下划线,不允许大写和其它特殊字符
in_file(string str, string filename)
如果str在filename中以正行的方式出现,返回true
instr(string str, string substr)
返回substr在str中第一次出现的位置。若任何参数为null返回null,若substr不在str中返回0。Str中第一个字符的位置为1
length(string A)
返回A的长度
locate(string substr, string str[, int pos])
返回substr在str的位置pos后第一次出现的位置
lower(string A) lcase(string A)
返回字符串的小写形式
lpad(string str, int len, string pad)
将str左侧用字符串pad填充,长度为len
ltrim(string A)
去掉字符串A左侧的空格,如:ltrim(' foobar ')的结果为'foobar '
array&struct&string,double&&
ngrams(array&array&string&&, int N, int K, int pf)
从一组标记化的Returns the top-k 句子中返回前K个N-grams
parse_url(string urlString, string partToExtract [, string keyToExtract])
返回给定URL的指定部分,partToExtract的有效值包括HOST,PATH, QUERY, REF, PROTOCOL, AUTHORITY,FILE和USERINFO。例如: &parse_url('/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') 返回 ''.。当第二个参数为QUERY时,可以使用第三个参数提取特定参数的值,例如: parse_url('/path1/p.php?k1=v1&k2=v2#Ref1',
'QUERY', 'k1') 返回'v1'
printf(String format, Obj... args)
将输入参数进行格式化输出
regexp_extract(string subject, string pattern, int index)
使用pattern从给定字符串中提取字符串。如: regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 返回'bar' 有时需要使用预定义的字符类:使用'\s' 做为第二个参数将匹配s,'s'匹配空格等。参数index是Java正则匹配器方法group()方法中的索引
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)
使用REPLACEMENT替换字符串INITIAL_STRING中匹配PATTERN的子串,例如: regexp_replace(&foobar&, &oo|ar&, &&) 返回'fb'
repeat(string str, int n)
将str重复n次
reverse(string A)
将字符串A翻转
rpad(string str, int len, string pad)
在str的右侧使用pad填充至长度len
rtrim(string A)
去掉字符串A右侧的空格,如: rtrim(' foobar ') 返回 ' foobar'
array&array&string&&
sentences(string str, string lang, string locale)
将自然语言文本处理为单词和句子,每个句子在适当的边界分割,返回单词的数组。参数lang和local为可选参数,例如: sentences('Hello there! How are you?') 返回( (&Hello&, &there&), (&How&, &are&, &you&) )
space(int n)
返回n个空格的字符串
split(string str, string pat)
用pat分割字符串str,pat为正则表达式
map&string,string&
str_to_map(text[, delimiter1, delimiter2])
使用两个分隔符将文本分割为键值对。第一个分隔符将文本分割为K-V 对,第二个分隔符分隔每个K-V 对。默认第一个分隔符为“,“,第二个分隔符为=
substr(string|binary A, int start) substring(string|binary A, int start)
返回A从位置start直到结尾的子串
substr(string|binary A, int start, int len) substring(string|binary A, int start, int len)
返回A中从位置start开始,长度为len的子串,如: substr('foobar', 4, 1) 返回 'b'
translate(string input, string from, string to)
将input中出现在from中的字符替换为to中的字符串,如果任何参数为null,结果为null
trim(string A)
去掉字符串A两端的空格
unbase64(string str)
将base64字符串转换为二进制
upper(string A) ucase(string A)
返回字符串A的大写形式
1.、字符串长度计算函数:length
语法: length(string A),
返回值: int
说明:返回字符串A的长度
hive& select length('iteblog')
2.、字符串反转函数:reverse
语法: reverse(string A)
返回值: string
说明:返回字符串A的反转结果
hive& select reverse(iteblog')
3.、字符串连接函数:concat
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
hive& select concat('www','.iteblog','.com')
4、带分隔符字符串连接函数:concat_ws
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
hive& select concat_ws('.','www','iteblog','com')
5、字符串截取函数:substr,substring
语法: substr(string A, int start),substring(string A, int start)
返回值: string
说明:返回字符串A从start位置到结尾的字符串
hive& select substr('iteblog',3)
selectsubstr('iteblog',-1)
6、 字符串截取函数:substr,substring
语法: substr(string A, int start, int len),substring(string A, intstart, int len)
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
hive& select substr('abcde',3,2)
hive& select substring('abcde',3,2)
hive&select substring('abcde',-2,2)
7、字符串转大写函数:upper,ucase
语法: upper(string A) ucase(string A)
返回值: string
说明:返回字符串A的大写格式
hive& select upper('abSEd')
hive& select ucase('abSEd')
8、字符串转小写函数:lower,lcase
语法: lower(string A) lcase(string A)
返回值: string
说明:返回字符串A的小写格式
hive& select lower('abSEd')
hive& select lcase('abSEd')
9、去空格函数:trim
语法: trim(string A)
返回值: string
说明:去除字符串两边的空格
hive& select trim(' abc ')
10、左边去空格函数:ltrim
语法: ltrim(string A)
返回值: string
说明:去除字符串左边的空格
hive& select ltrim(' abc ')
11、右边去空格函数:rtrim
语法: rtrim(string A)
返回值: string
说明:去除字符串右边的空格
hive& select rtrim(' abc ')
12、正则表达式替换函数:regexp_replace
语法: regexp_replace(string A, string B, string C)
返回值: string
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
hive& select regexp_replace('foobar', 'oo|ar', '')
13、正则表达式解析函数:regexp_extract
语法: regexp_extract(string subject, string pattern, int index)
返回值: string
说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
hive& select regexp_extract('foothebar', 'foo(.*?)(bar)', 1)
hive& select regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
hive& select regexp_extract('foothebar', 'foo(.*?)(bar)', 0)
注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。
select data_field,
regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,
regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,
regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc
from pt_nginx_loginlog_st
where pt = ''limit 2;
14、URL解析函数:parse_url
语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])
返回值: string
说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
hive& select parse_url('?weixin=iteblog_hadoop', 'HOST')
hive& select parse_url('?weixin=iteblog_hadoop',
& 'QUERY','weixin')
iteblog_hadoop
15、json解析函数:get_json_object
语法: get_json_object(string json_string, string path)
返回值: string
说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
hive& select get_json_object('{&store&:
{&fruit&:\[{&weight&:8,&type&:&apple&},{&weight&:9,&type&:&pear&}],
&bicycle&:{&price&:19.95,&color&:&red&}
& &email&:&amy@only_for_json_udf_test.net&,
&owner&:&amy&
& ','$.owner')
16、空格字符串函数:space
语法: space(int n)
返回值: string
说明:返回长度为n的字符串
hive& select space(10)
hive& select length(space(10))
17、重复字符串函数:repeat
语法: repeat(string str, int n)
返回值: string
说明:返回重复n次后的str字符串
hive& select repeat('abc',5)
abcabcabcabcabc
18、首字符ascii函数:ascii
语法: ascii(string str)
返回值: int
说明:返回字符串str第一个字符的ascii码
hive& select ascii('abcde')
19、左补足函数:lpad
语法: lpad(string str, int len, string pad)
返回值: string
说明:将str进行用pad进行左补足到len位
hive& select lpad('abc',10,'td')
tdtdtdtabc
注意:与GP,ORACLE不同,pad 不能默认
20、右补足函数:rpad
语法: rpad(string str, int len, string pad)
返回值: string
说明:将str进行用pad进行右补足到len位
hive& select rpad('abc',10,'td')
abctdtdtdt
21、分割字符串函数: split
split(string str, stringpat)
说明: 按照pat字符串分割str,会返回分割后的字符串数组
hive& select split('abtcdtef','t')
[&ab&,&cd&,&ef&]
22、集合查找函数:find_in_set
语法: find_in_set(string str, string strList)
返回值: int
说明: 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0
hive& select find_in_set('ab','ef,ab,de')
hive& select find_in_set('at','ef,ab,de')
本博客文章除特别声明,全部都是原创!
禁止个人和公司转载本文、谢谢理解:
下面文章您可能感兴趣Hive分组提取TopN操作 - JueFan_C - 博客园
随笔 - 33, 文章 - 0, 评论 - 22, 引用 - 0
今天在测试摄影部落做关联规则推荐的效果
这种推荐不能算是个性化推荐,因为只要前件项目固定了,推荐列表就是固定的,推荐的结果不会跟着人走
最终会成表一张规则表
Table(Item_a, Item_b, Rel)
其中Rel表示俩个项目之间的关系强弱
为了给每个项目生成一张推荐列表,则必须按照关系强弱做分组TopN操作
Hive的基础SQL没办法满足需求,只能自己写UDAF和UDTF了
import java.util.ArrayL
import java.util.C
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFE
import org.apache.hadoop.io.IntW
public class UDAFTopN extends UDAF {
//定义一个对象用于存储数据
public static class State {
public static class Target{
//神经病的,用Text的时候就运行结果不正确
public Target(){
target = null;
score = null;
public ArrayList&Target& list = new ArrayList&Target&();
private int
* 累加数据,把要排序的目标和目标值存进map中
* @param s 存储对象
* @param o 待排序目标
* @param i 目标的值
private static void increment(State s, String o, Double i) {
if (s.list == null) {
s.list = new ArrayList&State.Target&();
State.Target tmpTarget = new State.Target();
tmpTarget.target =
tmpTarget.score =
s.list.add(tmpTarget);
tmpTarget = new State.Target();
public static class UDAFTopNEvaluator implements UDAFEvaluator {
private final S
public UDAFTopNEvaluator() {
state = new State();
public void init() {
if (state.list != null) {
state.list.clear();
if (state.limit == 0) {
state.limit = 100;
public boolean iterate(String target, Double score, IntWritable limits) {
if (target == null || score == null || limits == null) {
return false;
state.limit = limits.get();
increment(state, target, score);
return true;
public State terminatePartial() {
public boolean merge(State other) {
if (state == null || other == null) {
return false;
state.limit = other.
state.list.addAll(other.list);
return true;
public String terminate() {
if (state == null || state.list.size() == 0) {
return null;
Collections.sort(state.list, new Statecomparator1());
int TopN = state.
int size = state.list.size();
StringBuffer str = new StringBuffer();
for (int i = 0; i & TopN && i & i++) {
str.append(state.list.get(i).target).append(",").append(state.list.get(i).score).append(";");
return new String(str.toString());
* 实现一个list按值的排序算法
@SuppressWarnings("unchecked")
public class Statecomparator1 implements Comparator&Object&{
public int compare(Object o1, Object o2){
State.Target s1 = (State.Target)o1;
State.Target s2 = (State.Target)o2;
return s1.score & s2.score ? 1:0;
接下来写一下UDTF,按照约定分隔符把一行拆出多行多列
import java.util.ArrayL
import org.apache.hadoop.hive.ql.exec.UDFArgumentE
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthE
import org.apache.hadoop.hive.ql.metadata.HiveE
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectI
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorF
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectI
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorF
public class UDTFTopN extends GenericUDTF {
public void close() throws HiveException {
public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
if (args.length != 1) {
throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentException("ExplodeMap takes string as a parameter");
ArrayList&String& fieldNames = new ArrayList&String&();
ArrayList&ObjectInspector& fieldOIs = new ArrayList&ObjectInspector&();
fieldNames.add("col1");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("col2");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("col3");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
public void process(Object[] args) throws HiveException {
String input = args[0].toString();
String[] test = input.split(";");
int size = test.
for (int i = 0; i & test. i++) {
String[] result
= new String[3];
String[] sp= test[i].split(",");
result[0] =sp[0];
result[1] =sp[1];
result[2] = String.valueOf(size - i);
forward(result);
} catch (Exception e) {
此时就可以为hive增加自定义函数后跟sql结合起来了
add jar /tmp/juefan/function/Photo.
create temporary function udaftopn as 'Item.UDAFTopN';
create temporary function udtftopn as 'Item.UDTFTopN';
SET hive.exec.reducers.bytes.per.reducer=;
drop table dm_fan_photo_prob_
create table dm_fan_photo_prob_rank as
select r.item_a, r.item_b, c.co, r.point, r.sim
select a.item_a, b.item_b, b.sim, b.point
select item_a, udaftopn(item_b, sim, 30) as ranks
from dm_fan_photo_prob_sim
where item_a && item_b
group by item_a
lateral view udtftopn(a.ranks)b as item_b, sim, point
join dm_fan_photo_prob_co c
on r.item_a = c.item_a and r.item_b = c.item_b;
上面是几个月前写的,用了UDAF跟UDTF,其实还有一种更简单的办法,直接用UDF,不过要跟row_number结合使用
1)先按照用户ID进行distribute by 分发,然后再在组内按点击时间排序,再利用row_number生成序列号
&&未完待续

我要回帖

更多关于 hive split 最后一个 的文章

 

随机推荐