我有一个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。 希望我能清楚地阐明问题陈述。
谢谢!
答案 0 :(得分:0)
您可以使用explode
和pivot
。以下是一些示例数据:
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()