使用Spark将一行转换为多行

时间:2017-10-24 13:32:28

标签: apache-spark pyspark apache-spark-sql spark-dataframe

我正在尝试使用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中执行此操作的好方法是什么?

感谢。

1 个答案:

答案 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))])

您可能需要一些额外的代码来处理标题行等,但这应该有效。