【发布时间】:2020-03-03 10:29:02
【问题描述】:
我需要加载一个 csv 文件,该文件有一列具有结构数组,并将其以 parquet 格式转储到另一个位置。
我的 csv 文件有两列,A 列和 B 列。
B列的数据类型为array<struct<x: bigint, y:bigint>>
我尝试使用如下架构加载 csv 文件:
val schemaB = ArrayType(StructType(Seq(StructField("x",LongType),StructField("y",LongType))))
val schema = new StructType().add("A",StringType).add("B",schemaB)
spark.read.option("sep", "\t").schema(schema).csv(<location>)
但是,这不起作用。我收到以下错误:
org.apache.spark.sql.AnalysisException: CSV data source does not support array<struct<x:bigint,y:bigint>> data type.;</struct<x:bigint,y:bigint>
我什至尝试强制转换为所需的类型,但没有成功。
这是 B 列外观的示例:
|B |
+---------------------------------------------------------------------------------------------+
|68222:102332,21215:1000,10982:70330,|
|93302:13320,263721:902615,9382:100020,|
【问题讨论】:
-
您能分享您的示例输入数据吗?你怎么能在 csv 文件中有一个数组类型?
-
@koiralo 我已经添加了示例。 csv 会将其作为字符串。倾倒镶木地板时,我需要能够将其写为结构数组。
-
如果是这样,您可以将其读取为字符串,解析并转换为您想要的任何类型,然后将其写入 parquet。
-
是的,就像我在帖子中提到的那样,我尝试将其作为字符串读取并将其转换为数组,然后再写入镶木地板。那也没有用。我收到一个错误,无法将字符串转换为结构数组。
标签: scala apache-spark parquet