使用 Spark 将一行转换为多行



我正在尝试使用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))])

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

相关内容

  • 没有找到相关文章

最新更新