我目前正在用 Apache Spark 做我的第一次尝试。我想读取带有 SQLContext 对象的 .csv 文件,但 Spark 不会提供正确的结果,因为该文件是欧洲文件(逗号作为小数分隔符,分号用作值分隔符)。有没有办法告诉 Spark 遵循不同的 .csv 语法?
val conf = new SparkConf()
.setMaster("local[8]")
.setAppName("Foo")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val df = sqlContext.read
.format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
.option("header","true")
.option("inferSchema","true")
.load("data.csv")
df.show()
Run Code Online (Sandbox Code Playgroud)
相关 .csv 中的一行如下所示:
04.10.2016;12:51:00;1,1;0,41;0,416
Run Code Online (Sandbox Code Playgroud)
Spark 将整行解释为一列。df.show()印刷:
+--------------------------------+
|Col1;Col2,Col3;Col4;Col5 |
+--------------------------------+
| 04.10.2016;12:51:...|
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)
在以前的尝试中,它df.show()甚至打印了更多的行内容,现在它显示“...”,但最终在第三列的逗号处切割行。
我想用 Spark 读取 .csv 文件并将列与拟合类型相关联。
val conf = new SparkConf()
.setMaster("local[8]")
.setAppName("Name")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val customSchema = StructType(Array(
StructField("date", DateType, true),
StructField("time",StringType, true),
StructField("am", DoubleType, true),
StructField("hum", DoubleType, true),
StructField("temp", DoubleType, true)
))
val df = sqlContext.read
.format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
.option("header","true")
.option("delimiter",";")
.schema(customSchema)
.load("data.csv")
Run Code Online (Sandbox Code Playgroud)
我正在阅读的一行 .csv 看起来像这样
+----------+--------+-----+-----+-----+
| date| time| am| hum| temp|
+----------+--------+-----+-----+-----+
|04.10.2016|12:51:20|1.121|0.149|0.462|
+----------+--------+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
如果我将日期的类型设置为字符串,Spark 将读取 .csv 并正确关联类型。如果我像上面显示的代码一样保留 customSchema,由于日期格式错误,Spark 将抛出异常(DateType will expect YYYY-MM-DD while mine is DD.MM.YYYY).
有没有办法将日期字符串重新格式化为 YYYY-MM-DD 并在之后应用架构?或者我也可以通过添加参数来改变 …