按分隔符拆分列数据

时间:2018-05-15 11:27:09

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

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

修改

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

MyLocationTextExtractionStrategy strategy = new MyLocationTextExtractionStrategy();
FilteredTextRenderListener strategyWithFilter = new FilteredTextRenderListener(strategy,
        new RegionTextRenderFilter(pdfReader.GetCropBox(1)));
PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategyWithFilter);

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

"ABC-DEF-PQR-XYZ"

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用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()