您的位置:首页 > 数据库

sparkSql(hive) 复合数据类型的使用

2017-01-09 22:48 405 查看
在Hive中可以使用复合数据类型,有三种常用的类型:Array 数组,Map 字典,Struct结构。在sparkSql中RDD可以转换成非常灵活的DataFrame,有下面几种语法:

rdd=sc.parallelize([1,2,3])

a=rdd.map(lambda item:Row(item))

schema=['test_colum']

a=a.toDF(schema)

a=rdd.map(lambda item:Row(item))

sqlContext.createDataFrame(a,['test_colum'])

schema=StructType([StructField('test_colum',StringType,True)])

df=sqlContext.applySchema(rdd,schema)

最后一种创建方式可以很灵活的设置字段的类型,包括数据类型和复合类型

但是如果需要将数据结构完整的存储为Hive表,那么在RDD到DataFrame转换中需要遵守一些规则。

在Hive中创建复合数据类型的语法:

create table plan(

clientid string

,plan_info array<map<string,string>> --originalid,yield

)

Hive 中数据类型可以继续嵌套到很复杂的程度

业务背景:一个用户可以创建多个组合,需要按照用户的维度提取组合ID及累积收益率,并插入到Hive表中

rdd=sc.parallelize([([{'originalid':'A01',yield:1.11},{'origianlid':'A02','yield':1.23}],)])

schema=StructType([StructField('plan',ArrayType(MapType(StringType,StringType,True),True),True)])

table=sqlContext.createDataFrame(rdd,schema)

table.registerTempTable("t1")

sqlContext.sql("create table zhanbing_test as select * from t1")

在Hive中的Map类型是有Spark中的dict类型转换而来,在Hive中智能指定一种数据类型但是在spark中可以根据key的不同,对value指定多种,所以最好使用String类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: