Spark - 使用非美国数字格式

时间:2017-03-21 11:10:16

标签: csv apache-spark

我有一个CSV文件,我想将其转换为Parquet进行进一步处理。使用

sqlContext.read()
.format("com.databricks.spark.csv")
.schema(schema)
.option("delimiter",";")
.(other options...)
.load(...)
.write()
.parquet(...) 
当我的架构只包含字符串时,

工作正常。但是,有些字段是我希望能够存储为数字的数字。

问题是该文件不是真正的" csv"但是以分号分隔的文件,并且数字用德语表示法格式化,即逗号用作十进制分隔符。

例如,美国在此文件中的123.01将被存储为123,01

有没有办法强制读取不同语言环境中的数字或其他一些解决方法,这样我就可以在不先将CSV文件转换为其他格式的情况下转换此文件?我查看了Spark代码和一个似乎引起问题的令人讨厌的事情是在CSVInferSchema.scala第268行(spark 2.1.0)中 - 解析器执行US格式而不是例如依赖于为JVM设置的Locale,或允许以某种方式配置它。

我想过使用UDT却无处可去 - 我无法解决如何让它让我自己处理解析(无法找到使用UDT的好例子...... )

关于直接实现这一目标的任何建议,即解析步骤,或者我将被迫进行中间转换,然后才将其转换为镶木地板?

1 个答案:

答案 0 :(得分:1)

对于其他可能正在寻找答案的人 - 我现在使用(Java)的解决方法是:

JavaRDD<Row> convertedRDD = sqlContext.read()
.format("com.databricks.spark.csv")
.schema(stringOnlySchema)
.option("delimiter",";")
.(other options...)
.load(...)
.javaRDD()
.map ( this::conversionFunction );
sqlContext.createDataFrame(convertedRDD, schemaWithNumbers).write().parquet(...);

转换函数需要一行,并且需要返回一个新的Row,其中字段根据需要转换为数值(或者,事实上,这可以执行任何转换)。 Java中的行可以由RowFactory.create(newFields)创建。

我很高兴听到任何其他建议如何解决这个问题,但现在这个工作正常。 :)

相关问题