【问题标题】:split content of column into lines in pyspark将列的内容拆分为pyspark中的行
【发布时间】:2017-11-28 13:33:01
【问题描述】:

我有一个数据框 df:

+------+----------+--------------------+
|SiteID| LastRecID|        Col_to_split|
+------+----------+--------------------+
|     2|1056962584|[214, 207, 206, 205]|
|     2|1056967423|          [213, 208]|
|     2|1056870114|     [213, 202, 199]|
|     2|1056876861|[203, 213, 212, 1...|

我想将列拆分成这样的行:

+----------+-------------+-------------+
|     RecID|        index|        Value|
+----------+-------------+-------------+
|1056962584|            0|          214|
|1056962584|            1|          207|
|1056962584|            2|          206|
|1056962584|            3|          205|
|1056967423|            0|          213|
|1056967423|            1|          208|
|1056870114|            0|          213|
|1056870114|            1|          202|
|1056870114|            2|          199|
|1056876861|            0|          203|
|1056876861|            1|          213|
|1056876861|            2|          212|
|1056876861|            3|          1..|
|1056876861|       etc...|       etc...|

Value 包含列表中的值。 Index 包含列表中值的索引。

如何使用 PySpark 做到这一点?

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    从 Spark 2.1.0 开始,您可以使用 posexplode 哪个 unnest 数组列并输出每个元素的索引,(使用来自 @Herve 的数据):

    import pyspark.sql.functions as F
    df.select(
        F.col("LastRecID").alias("RecID"), 
        F.posexplode(F.col("coltosplit")).alias("index", "value")
    ).show()
    +-----+-----+-----+
    |RecID|index|value|
    +-----+-----+-----+
    |10526|    0|  214|
    |10526|    1|  207|
    |10526|    2|  206|
    |10526|    3|  205|
    |10896|    0|  213|
    |10896|    1|  208|
    +-----+-----+-----+
    

    【讨论】:

      【解决方案2】:

      我很快尝试使用 Spark 2.0 如果您想以不同的方式订购,可以稍微更改查询。

      d = [{'SiteID': '2', 'LastRecId': 10526, 'coltosplit': [214,207,206,205]}, {'SiteID': '2', 'LastRecId': 10896, 'coltosplit': [213,208]}]
      df = spark.createDataFrame(d)
      
      +---------+------+--------------------+
      |LastRecId|SiteID|          coltosplit|
      +---------+------+--------------------+
      |    10526|     2|[214, 207, 206, 205]|
      |    10896|     2|          [213, 208]|
      +---------+------+--------------------+
      
      query = """
      select LastRecId as RecID, 
      (row_number() over (partition by LastRecId order by 1)) - 1 as index, 
      t as Value 
      from test 
      LATERAL VIEW explode(coltosplit) test AS t
      """
      df.createTempView("test")
      spark.sql(query).show()
      
      +-----+-----+-----+
      |RecID|index|Value|
      +-----+-----+-----+
      |10896|    0|  213|
      |10896|    1|  208|
      |10526|    0|  214|
      |10526|    1|  207|
      |10526|    2|  206|
      |10526|    3|  205|
      +-----+-----+-----+
      

      所以基本上我只是将列表分解为一个新列。并在此列上应用行号。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        相关资源
        最近更新 更多