我正在尝试使用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中执行此操作的好方法是什么?
谢谢。
这个想法是从每个输入行生成一个行列表,如您所显示的。这将给出行列表的 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))])
您可能需要一些额外的代码来处理标题行等,但这应该有效。