【问题标题】:Transforming one row into many rows using Spark使用 Spark 将一行转换为多行
【发布时间】:2017-10-24 13:32:28
【问题描述】:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    这个想法是从每个输入行生成一个行列表,如您所示。这将给出行列表的 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))])
    

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

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2019-02-20
      • 1970-01-01
      • 2018-04-04
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多