spark hive 结合处理 把多行变成多列
原数据格式 :
gid id score
a1 1 90
a1 2 80
a1 3 79
a1 4 80
a2 1 79
a2 3 89
a3 2 45
a3 4 57
a4 3 56
a5 3 89
......
要把数据变成:
gid id_1 id_2 id_3 id_4 score
a1 90 80 79 80
a2 79 0 89 0
a3 0 45 0 57
.......
数据量很大,上百亿条,所以用hive与spark结合的形式,在hive中见表,先把每个gid 的不同id都合并成一行,然后输入spark中进行分割处理成多列。
一、hive先将每个gid的多行数据合并成一行
create table a_id_score_concat as
select a.gid,concat_ws(',',collect_set(concat(a.model_id,'=',a.score))) as score #把model_id 与score用等号合并起来,便于后面拆开后匹配,也能解决每个gid的id个数不等的问题
from a_id_score a group by a.gid;
输出形式:
a1 1=90,2=80,3=79,4=80
a2 1=79,3=89
二、用spark的函数,把合并的几行再分成多列,本质是python函数
from pyspark.sql import SQLContext,Row
from pyspark.mllib.regression import LabeledPoint
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
from pyspark.mllib.linalg import SparseVector, DenseVector
df2=sqlContext.sql("select * from a_id_score_concat")
def splits(lt1):
lt0=['null','10101','10102','10103','10105','10106','10121','10122','10123','10125','10126','10201','10221'] #id列表
#需要合并的id,加一个null是为了跟out的列表长度一致,后面索引好匹配。
out=['na','0','0','0','0','0','0','0','0','0','0','0','0'] #拆分出来的矩阵格式 列数据初始化,没有的id位置默认为0
gid=lt1[0]
sco=lt1[1].split(",") #取出合并的score
out[0]=gid
for i in sco:
s1=i.split("=") #把每个等式拆开
index1=lt0.index(s1[0]) #找索引
out[index1]=s1[1] #在索引对应列放入数据
return out
df3=sqlContext.createDataFrame(df2.map(splits,["gid",'m10101','m10102','m10103','m10105','m10106','m10121','m10122','m10123','m10125','m10126','m10201','m10221'])
#保存dataframe,数据输出
df3.saveAsTable(tableName="id_scores",source="parquet",mode="overwrite")
hive中建表保存:
hadoop fs -mv hdfs:./xiaofei_model_installed_pkgs hdfs:./zhangb.db
# 在hive中建表语句
create external table aaaaaa (
pkg string,cnt01 bigint,cnt11 bigint,xsb double,chi2 double,gain double,iv double,rank1 int ,rank2 int ,rank3 int ,rank int )
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
'hdfs:./zhangb.db/id_scores';
spark hive 结合处理 把多行变成多列的更多相关文章
- [Spark][Hive]Hive的命令行客户端启动:
[Spark][Hive]Hive的命令行客户端启动: [training@localhost Desktop]$ chkconfig | grep hive hive-metastore 0:off ...
- 伪分布式Spark + Hive on Spark搭建
Spark大数据平台有使用一段时间了,但大部分都是用于实验而搭建起来用的,搭建过Spark完全分布式,也搭建过用于测试的伪分布式.现在是写一遍随笔,记录一下曾经搭建过的环境,免得以后自己忘记了.也给和 ...
- Spark(Hive) SQL中UDF的使用(Python)
相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...
- Spark(Hive) SQL数据类型使用详解(Python)
Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...
- [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子
[Spark][Hive][Python][SQL]Spark 读取Hive表的小例子$ cat customers.txt 1 Ali us 2 Bsb ca 3 Carls mx $ hive h ...
- Spark记录-源码编译spark2.2.0(结合Hive on Spark/Hive on MR2/Spark on Yarn)
#spark2.2.0源码编译 #组件:mvn-3.3.9 jdk-1.8 #wget http://mirror.bit.edu.cn/apache/spark/spark-2.2.0/spark- ...
- Spark(Hive) SQL中UDF的使用(Python)【转】
相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...
- spark hive结合杂记(hive-site.xml)
1.下载spark源码,在spark源码目录下面有个make-distribution.sh文件,修改里面的参数,使编译后能支持hive,修改后执行该文件.(要预先安装好maven才能编译). 2.将 ...
- hive行存储与列存储
首先判断hive表是行存储还是列存储 判断方法: 1.使用hiveSQL"show create table table_name",这种方式,可以查看建表时候指定的那种方式; 2 ...
随机推荐
- JSP内置对象的解析
JSP九大对象及四大作用域并与之对应图表: 隐式对象 作用域 所属类 application application javax.servlet.ServletContext session sess ...
- 惩罚因子(penalty term)与损失函数(loss function)
penalty term 和 loss function 看起来很相似,但其实二者完全不同. 惩罚因子: penalty term的作用是把受限优化问题转化为非受限优化问题. 比如我们要优化: min ...
- C语言实现Web客户端(转-kungstriving)
和我的上一篇文章是一起写的,呵呵,大家给提点意见啊. :-) /*********filename : Client.cpp**************** 该程序通过标准socket实 ...
- JSBinding+SharpKit / 更新的原理
首先,其实不是热更新,而是更新. 热更新意思是不重启游戏,但只要你脚本里有存储数据,就不可能.所以只能叫更新. 但大家都这么说,所以... 先举个具体的例子: 如果是C#:在 Prefab 的 Gam ...
- 通过前台选择输入用来计算圆,三角形以及长方形的面积(此题目主要是while以及if 的使用)
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现计算圆面积,三角形面积,长方形面积'''flag=Truewhile flag: pi ...
- phoenix创建二级索引
create table user (id varchar primary key, firstname varchar, lastname varchar); create index user_i ...
- Intel DPDK的一些参资料
dpdk.org What it is Intel® DPDK is a set of libraries and drivers for fast packet processing on x86 ...
- python--ulipad控制台中文输出乱码
ulipad用起来顺手,而不尽人意的地方时,它不能正确输出中文.而且有人指出这和文件的编码没关系,所以将”设置“选项里”缺省文档编码“修改为”utf-8“也无济于事.为了解决这个问题,我在网上搜了搜, ...
- 【MySQL】InnoDB日志机制深入分析
版权声明:尊重博主劳动成果,欢迎转载,转载请注明出处 --爱技术的华仔 Log & Checkpoint Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfi ...
- CRM JS 设置lookup字段 setSimpleLookupValue
function setSimpleLookupValue(LookupId, Type, Id, Name) { /// <summary> /// Sets the value for ...