提前感谢。
你好,我正在使用spark数据帧和scala进行一些数据处理,我有一个要求,我需要从拼花文件中读取具有相同数据类型的多个列,即在我的情况下为结构类型,以处理和创建具有与结构类型字段(即field1、field2和field3)相同模式的新数据帧,并用来自所有列的数据填充数据帧,示例如下所示。
例如,假设我有3列
a)column1: struct (nullable = true)
|-- field1: string (nullable = true)
|-- field2: string (nullable = true)
|-- field3: string (nullable = true)
b)column2: struct (nullable = true)
|-- field1: string (nullable = true)
|-- field2: string (nullable = true)
|-- field3: string (nullable = true)
c)column3: struct (nullable = true)
|-- field1: string (nullable = true)
|-- field2: string (nullable = true)
|-- field3: string (nullable = true)
我能够使用下面的代码片段读取列中的所有值
dataframe.select("column1","column2","column3")
以上代码返回行对象
[[column1field1,column1field2,column1field3],null,null]
[null,[column2field1,column2field2,column2field3],null]
[null,null,[column3field1,column3field2,column3field3]]
[[column1field1,column1field2,some record, with multiple,separator],null,null]
这里的问题是,我能够使用","分隔符从行对象中读取值,并能够用3个字段填充数据帧,但由于字段是字符串,所以在镶木地板中有一些记录,我在字符串数据本身中有多个",",如上一行对象中所示,因此,当我使用","分隔符来检索Row对象的值时,数据帧模式出现了问题,它给了我3个以上的字段。我怎样才能消除这个错误?是否有任何条款可以更改Spark中Row数组值的对象分隔符来修复此问题?
是的,您可以使用不同的分隔符加载,如
sqlContext.load("com.databricks.spark.csv", yourSchema, Map("path" -> yourDataPath, "header" -> "false", "delimiter" -> "^"))
或
sqlContext.read.format("com.databricks.spark.csv").schema(yourSchema).options(Map("path" -> schema, "header" -> "false", "delimiter" -> "^")).load()
这取决于你使用的是哪种版本的火花。
至于字符串中的分隔符,在加载之前需要使用","分隔符对其进行转义,或者使用不同的分隔符。