在我的Spark Dataframe中,其中一列是字符串
Activities
"1 1 1 1 0 0 0 0 0"
"0 0 0 1 1 1 0 0 0"
"1 1 1 1 0 0 0 0 0"
"0 0 0 1 1 1 0 0 0"
"1 1 1 1 0 0 0 0 0"
"0 0 0 1 1 1 0 0 0"
我希望从此列的每一行收集字符串,并通过串联列出一个列表。然后,将这个巨大的字符串分割成一个巨大的单个整数数组,例如
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,...]
(当然,可以先将字符串拆分成列表,然后将所有列表附加到一个大列表中,但是仍然存在如何串联基于RDD的列表的问题)
我可以使用pythons本地数据结构:
import pyspark.sql.functions as F
allActivities = []
activitiesListColumn = df.agg(F.collect_list("Activities").alias("Activities")).collect()[0]
for rowActivity in activitiesListColumn["Activities"]:
activities = rowActivity.split()
allActivities += activities
print(allActivities)
如何使用基于RDD(即并行化)的数据结构来完成此任务?
答案 0 :(得分:0)
这可能与GROUP_CONCAT方法一起使用,但是spark-sql不包含此方法。我们可以确定一个运行像GROUP_CONCAT的UDF。关于此UDF的详细信息,您可以在以下链接中看到:SPARK SQL replacement for mysql GROUP_CONCAT aggregate function ..但是我们必须将分隔符(','更改为'')。然后,您可以尝试以下行:
df.agg(GroupConcat(new ColumnName("your_string_array"))).show
GroupConcat对象为:
object GroupConcat extends UserDefinedAggregateFunction {
def inputSchema = new StructType().add("x", StringType)
def bufferSchema = new StructType().add("buff", ArrayType(StringType))
def dataType = StringType
def deterministic = true
def initialize(buffer: MutableAggregationBuffer) = {
buffer.update(0, ArrayBuffer.empty[String])
}
def update(buffer: MutableAggregationBuffer, input: Row) = {
if (!input.isNullAt(0))
buffer.update(0, buffer.getSeq[String](0) :+ input.getString(0))
}
def merge(buffer1: MutableAggregationBuffer, buffer2: Row) = {
buffer1.update(0, buffer1.getSeq[String](0) ++ buffer2.getSeq[String](0))
}
def evaluate(buffer: Row) = UTF8String.fromString(
buffer.getSeq[String](0).mkString(" "))
}