如何在spark中连接一列记录?

时间:2016-08-26 09:22:16

标签: scala apache-spark

我有2列,想要连接两个,下面是一小组数据:

location ^~ /.well-known/acme-challenge/ { ... }

我希望这可以如下所示,所以基本上视图是按ID分组并连接注释。

"screenshot": {
     "data": "_9j_4AAQSkZJRgAB.....=",
     "height": 569,
     "mime_type": "image/jpeg",
     "width": 320
 }

2 个答案:

答案 0 :(得分:2)

另一种不使用SQL查询的方法:

import scala.collection.mutable

val myUDF = udf[String, mutable.WrappedArray[String]](_.mkString(" "))
df.groupBy($"id")
  .agg(collect_list("comments").as("comments"))
  .withColumn("comments", myUDF($"comments"))
  .show()

它还需要HiveContext作为SQLContext

答案 1 :(得分:1)

您可以使用UDF(用户定义的函数)。假设您有DataFrame名为df的数据,您可以尝试这样的事情:

import scala.collection.mutable
sqlContext.udf.register("ArrayToString",(a: mutable.WrappedArray[String]) => a.mkString("\n"))
df.registerTempTable("IDsAndComments")
val new_df = sqlContext.sql("WITH Data AS (SELECT ID, collect_list(Comments) AS cmnts FROM IDsAndComments GROUP BY ID) SELECT ID, ArrayToString(cmnts) AS Comments FROM Data")

这里发生的是为sqlContext定义一个新函数,以便在解析SQL代码时使用。此函数采用WrappedArray(这是您从Spark的DataFrame中获得的数组类型),并将其转换为字符串,其中数组的每个元素都用新行分隔。

collect_list是返回其分组值的数组的函数。请注意,它是HiveContext功能,因此您需要sqlContext成为HiveContext