将dataframe的map列转换为struct column

时间:2017-08-18 05:34:33

标签: scala apache-spark dataframe

我已经有了一个数据框,其中一个列的类型是地图。该地图来自UDF和数据帧的现有列 我的问题是有没有办法将列转换为结构类型
顺便说一句,我使用scala 2.10,并且地图列有超过50个字段。所以我不想使用案例类 谢谢。

1 个答案:

答案 0 :(得分:0)

由于没有足够的信息来说明您的数据如何以及您想要的输出类型,我根据我对您的问题的理解来写这个答案。

val df = sqlContext.sql("""
select map(1,"a" ,2,"b" ,3,"c" ,4,"d" ,5,"e" ,6,"f" ,
7,"g" ,8,"h" ,9,"i" ,10,"j" ,11,"k" ,12,"l" ,13,"m" ,
14,"n" ,15,"o" ,16,"p" ,17,"q" ,18,"r" ,19,"s" ,20,"t" ,
21,"u" ,22,"v" ,23,"w" ,24,"x" ,25,"y" ,26,"z" )as mapcol 
""")

您可以编写UDF,将地图转换为任何Seq类型,在数据框中将其显示为struct。 struct的每个元素都是一个用逗号分隔的键值对(或者你想要的任何东西)。

val toStruct = udf( (c1: Map[Int, String]) => c1.map {
    case (k,v) => k+","+v
}.toSeq)

现在,在您的数据帧上调用此UDF。

val structDF = df.withColumn("structcol", toStruct('mapcol) )
structDF.show
+--------------------+--------------------+
|              mapcol|           structcol|
+--------------------+--------------------+
|Map(5 -> e, 10 ->...|[5,e, 10,j, 24,x,...|
+--------------------+--------------------+

获取单个元素:

structDF.selectExpr("structcol[0]").show

+------------+
|structcol[0]|
+------------+
|         5,e|
+------------+