Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark-从非美国数字格式的CSV文件加载数字_Csv_Apache Spark - Fatal编程技术网

Spark-从非美国数字格式的CSV文件加载数字

Spark-从非美国数字格式的CSV文件加载数字,csv,apache-spark,Csv,Apache Spark,我有一个CSV文件,我想转换成拼花地板,以便进一步处理。使用 sqlContext.read() .format("com.databricks.spark.csv") .schema(schema) .option("delimiter",";") .(other options...) .load(...) .write() .parquet(...) 当我的模式只包含字符串时,工作正常。但是,有些字段是我希望能够存储为数字的数字 问题是,文件不是以实际的“csv”形式到达的,而是以分号

我有一个CSV文件,我想转换成拼花地板,以便进一步处理。使用

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)——解析器强制我们格式化,而不是依赖于JVM的语言环境设置,或者允许以某种方式进行配置

我曾想过使用UDT,但却一事无成——我不知道如何让它让我自己处理解析(真的找不到一个使用UDT的好例子…)


关于直接实现这一点的方法,即解析步骤,或者我将被迫进行中间转换,然后再将其转换为拼花地板,有什么建议吗?

对于其他可能正在寻找答案的人,我现在采用的解决方法(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(...);
javarddconvertedrdd=sqlContext.read()
.format(“com.databricks.spark.csv”)
.schema(stringOnlySchema)
.选项(“分隔符“,”;”)
(其他选择…)
.加载(…)
.javaRDD()
.map(this::conversionFunction);
createDataFrame(convertedRDD,schemaWithNumbers).write().parquet(…);
conversion函数获取一行,并需要返回一个新行,其中的字段需要转换为相应的数值(或者,实际上,这可以执行任何转换)。Java中的行可以由RowFactory.create(newFields)创建


我很高兴听到任何其他建议如何处理这一问题,但目前这是可行的

这个正在开发中,请看:谢谢,mtoto。在我需要它之前,这可能还没有准备好,所以现在我在推进到拼花地板之前实现了从纯字符串模式(适当地解析数字)的转换。