首页 > 解决方案 > 使用 Java 读取 CSV 文件包含 Spark 中的结构类型

问题描述

我正在尝试为程序编写测试用例。为此,我正在读取一个包含以下格式数据的 CSV 文件。
account_number,struct_data 123456789,{"key1":"value","key2":"value2","keyn":"valuen"} 987678909,{"key1":"value0","key2":"value20","keyn":"valuen0"}
数百个这样的行。

我需要将第二列作为结构阅读。但我得到了错误 struct type expected, string type found

我尝试转换为 StructType,然后收到错误为“StringType 无法转换为 StructType”。

我应该改变我的 CSV 的方式吗?我还可以做些什么?

标签: javaapache-sparkhadoopapache-spark-sql

解决方案


我在 Scala Spark 中给出了我的解决方案,它可能会为您的查询提供一些见解

scala> val sdf = """{"df":[{"actNum": "1234123", "strType": [{"key1": "value1", "key2": "value2"}]}]}"""
sdf: String = {"df":[{"actNum": "1234123", "strType": [{"key1": "value1", "key2": "value2"}]}]}

scala> val erdf = spark.read.json(Seq(sdf).toDS).toDF().withColumn("arr", explode($"df")).select("arr.*")
erdf: org.apache.spark.sql.DataFrame = [actNum: string, strType: array<struct<key1:string,key2:string>>]

scala> erdf.show()
+-------+-----------------+
| actNum|          strType|
+-------+-----------------+
|1234123|[[value1,value2]]|
+-------+-----------------+


scala> erdf.printSchema
root
 |-- actNum: string (nullable = true)
 |-- strType: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- key1: string (nullable = true)
 |    |    |-- key2: string (nullable = true)


推荐阅读