使用不同分隔符的Spark CSV转换为DataSet

3
我有两个 CSV 文件,正在使用 Java 中的 Spark 聚合它们。这些文件具有不同的分隔符。
file1.dat:
011!345!Ireland

files2.dat:

022Ç486ÇBrazil

我使用的代码是:
Dataset<Row> people = spark.read().format("csv").option("header", "false").option("delimeter", "\u00C7").option("delimeter", "!").load(logFile);

输出:

Error:Cannot resolve column name

如果我移除一个分隔符:
Dataset<Row> people = spark.read().format("csv").option("header", "false").option("delimeter", "\u00C7").load(logFile);

输出:

Sno|code|Country
null|null|null 
022|486|Brazil

有没有一种方法可以执行这个操作? 这两个文件可以在同一个Spark代码中聚合吗?

注意:DataSet<Row>只是一个DataFrame - OneCricketeer
1个回答

2

您不能同时使用多个分隔符。

相反,分别读取文件并使用union (文档)将它们合并在一起。例如:

Dataset<Row> people1 = spark.read()
  .option("header", "false")
  .option("delimeter", "!")
  .csv(logFile1);
Dataset<Row> people2 = spark.read()
  .option("header", "false")
  .option("delimeter", "\u00C7")
  .csv(logFile2);

Dataset<Row> people = people1.union(people2);

将整个文件读入一个“行”DF,然后缓存它,再进行过滤/解析+联合,这样做有意义吗?我认为如果在csv().option()之外解析分隔符,则可能不需要联合。 - OneCricketeer
@cricket_007 这将是另一个可能的解决方案。实际上,我不确定哪个方案在性能方面更好,但我认为上述方案更易于理解和更清晰(因为文件的分隔符不同,如果同一文件有多个分隔符,则此答案将无法工作,必须手动进行解析)。 - Shaido
如果有两个文件,那我同意...我对问题中两次显示load(logFile)感到困惑。 - OneCricketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接