我正在尝试使用Spark将一行变成多行。我的目标就像SQL UNPIVOT。
我有一个管道分隔的文本文件,360GB,压缩(gzip)。它有超过1,620列。这是基本布局:
primary_key|property1_name|property1_value|property800_name|property800_value
12345|is_male|1|is_college_educated|1
这些属性名称/值字段有800多个。大约有2.8亿行。该文件位于S3存储桶中。
用户希望我取消数据。例如:
primary_key|key|value
12345|is_male|1
12345|is_college_educated|1
这是我第一次使用Spark。我正在努力找到一个很好的方法来做到这一点 在Spark中执行此操作的好方法是什么?
感谢。
答案 0 :(得分:3)
我们的想法是如您所示,从每个输入行生成一个行列表。这将给出行列表的RDD。然后使用flatMap
获取各行的RDD:
如果您的文件是rdd1
加载的,那么以下内容可以为您提供所需内容:
rdd1.flatMap(break_out)
其中处理线的功能定义为:
def break_out(line):
# split line into individual fields/values
line_split=line.split("|")
# get the values for the line
vals=line_split[::2]
# field names for the line
keys=line_split[1::2]
# first value is primary key
primary_key=vals[0]
# get list of field values, pipe delimited
return(["|".join((primary_key, keys[i], vals[i+1])) for i in range(len(keys))])
您可能需要一些额外的代码来处理标题行等,但这应该有效。