【问题标题】:Splitting a column data as per delimiter根据分隔符拆分列数据
【发布时间】:2018-10-25 05:14:51
【问题描述】:

我有一个 Spark (1.4) 数据框,其中列中的数据类似于“1-2-3-4-5-6-7-8-9-10-11-12”。我想将数据分成多列。请注意,字段的数量可以从 1 到 12 不等,它不是固定的。 附言我们正在使用 Scala API。

编辑:

编辑原始问题。我有如下分隔字符串:

"ABC-DEF-PQR-XYZ"

从此字符串中,我需要在单独的列中创建分隔字符串,如下所示。请注意,此字符串在 DF 的列中。

Original column: ABC-DEF-PQR-XYZ
New col1 : ABC
New col2 : ABC-DEF
New col3 : ABC-DEF-PQR
New col4 : ABC-DEF-PQR-XYZ

请注意,可以有 12 个这样的新列需要从原始字段派生。此外,原始列中的字符串可能会有所不同,即有时是 1 列,有时是 2,但最大值可以是 12。 希望我已经清楚地阐明了问题陈述。

谢谢!

【问题讨论】:

  • 上面的“12个这样的列”是不是指的是原来的一串数字,想必不是你介绍的新文吧?
  • 如果我理解正确,是的。对于 12 个新列,数据将从表的原始字段派生,并且该示例还描述了每个列将如何具有数据。如果字符串在示例列 10、11、12 中没有那么大的数据,那么这些字段将包含空白数据。所以原始字段中字符串的长度是动态的,不是固定的。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

您可以使用explodepivot。以下是一些示例数据:

df=sc.parallelize([["1-2-3-4-5-6-7-8-9-10-11-12"], ["1-2-3-4"], ["1-2-3-4-5-6-7-8-9-10"]]).toDF(schema=["col"])

现在为行添加一个唯一的 id,以便我们可以跟踪数据属于哪一行:

df=df.withColumn("id", f.monotonically_increasing_id())

然后通过分隔符-拆分列,然后分解得到一个长格式的数据集:

df=df.withColumn("col_split", f.explode(f.split("col", "\-")))

最后以id 为中心回到宽格式:

df.groupby("id")
  .pivot("col_split")
  .agg(f.max("col_split"))
  .drop("id").show()

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2018-12-27
    • 2023-03-16
    • 2019-05-17
    • 2013-11-27
    相关资源
    最近更新 更多