从spark scala中的数据帧创建映射
我在数据框中有一个json字符串,如下所示从spark scala中的数据帧创建映射,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我在数据框中有一个json字符串,如下所示 aaa | bbb | ccc |ddd | eee -------------------------------------- 100 | xxxx | 123 |yyy|2017 100 | yyyy | 345 |zzz|2017 200 | rrrr | 500 |qqq|2017 300 | uuuu | 200 |ttt|2017 200 | iiii | 500 |
aaa | bbb | ccc |ddd | eee
--------------------------------------
100 | xxxx | 123 |yyy|2017
100 | yyyy | 345 |zzz|2017
200 | rrrr | 500 |qqq|2017
300 | uuuu | 200 |ttt|2017
200 | iiii | 500 |ooo|2017
我想得到结果
{100,[{xxxx:{123,yyy}},{yyyy:{345,zzz}}],2017}
{200,[{rrrr:{500,qqq}},{iiii:{500,ooo}}],2017}
{300,[{uuuu:{200,ttt}}],2017}
请帮助这项工作:
val df = data
.withColumn("cd", array('ccc, 'ddd)) // create arrays of c and d
.withColumn("valuesMap", map('bbb, 'cd)) // create mapping
.withColumn("values", collect_list('valuesMap) // collect mappings
.over(Window.partitionBy('aaa)))
.withColumn("eee", first('eee) // e is constant, just get first value of Window
.over(Window.partitionBy('aaa)))
.select("aaa", "values", "eee") // select only columns that are in the question selected
.select(to_json(struct("aaa", "values", "eee")).as("value")) // create JSON
一定要这样做
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._`
您可以使用
lit()
创建一个映射,将值定义为常量,或者使用$“col\u name”
从数据框中的其他列获取它们,如下所示:
val new_df = df.withColumn("map_feature", map(lit("key1"), lit("value1"), lit("key2"), $"col2"))
你的标题和问题根本不匹配。我应该提到什么?你建议的输出不是json。谢谢Gaweda。但partitionby不起作用。但现在的要求是改变。我有一份清单below@gayathri“不工作”是什么意思?我已经用你的数据测试过了。如果您想拥有纯字符串列表,可以使用IntelliJ(scala 2.10.6)执行collect()Hi Gaweda,iam。使用column(“valuesMap”,map('bbb,'cd)),无法识别map,也无法识别aso over(Window.partitionBy('aaa))。我已经导入了sql.functions Pls helpmap是在functions对象内部,所以它应该是可见的