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