我有2列,想要连接两个,下面是一小组数据:
location ^~ /.well-known/acme-challenge/ { ... }
我希望这可以如下所示,所以基本上视图是按ID分组并连接注释。
"screenshot": {
"data": "_9j_4AAQSkZJRgAB.....=",
"height": 569,
"mime_type": "image/jpeg",
"width": 320
}
答案 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