2017-09-06 54 views
1

我有一个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 |ooo|2017 

我想要得到的结果作为

{100,[{xxxx:{123,yyy}},{yyyy:{345,zzz}}],2017} 
{200,[{rrrr:{500,qqq}},{iiii:{500,ooo}}],2017} 
{300,[{uuuu:{200,ttt}}],2017} 

请帮助

+0

你的标题和问题根本不匹配。 – philantrovert

+0

我应该提及什么 – gayathri

+0

您建议的输出不是json。 – Rumoku

回答

1

这工作:

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 

Ma确保你有进口org.apache.spark.sql.functions._org.apache.spark.sql.expression._

+0

谢谢Gaweda。但是partitionby不起作用。但现在的要求是变化。我有如下列表 – gayathri

+0

@gayathri你是什么意思的“不工作”?我已经在您的数据上进行了测试。如果你想使用普通的String列表,你可以使用IntelliJ(scala 2.10.6).withColumn(“valuesMap”,map('bbb,'cd))来实现collect() –

+0

Hi Gaweda, aso over(Window.partitionBy('aaa))无法识别。我已经导入了sql.functions请帮助 – gayathri