簡體   English   中英

如何讀取 csv 文件並將一列轉換為 Scala+Spark 中的 Map[String, String] 類型?

[英]How to read csv file and convert one column to Map[String, String] type in Scala+Spark?

我有一個包含幾列的.csv文件。

以一行為例:

aaa,bbb,{'foo': 'xxx', 'bar': 'zzz'}

我想閱讀它並轉換為以下類型的架構:

field1: String,
field2: String,
field3: Map[String, String]

我可以用這樣的原始類型來做到這一點:

private val someSchema =
    StructType(
      StructField("field1", StringType, true) ::
      StructField("field2", StringType, true) ::
      StructField("field3", StringType, true) :: Nil)

     spark.read
      .format("csv")
      .option("header", true)
      .schema(someSchema)
      .load("path.csv")

但是當涉及到 Map[String, String] 時,它不起作用,因為

線程“主”org.apache.spark.sql.AnalysisException 中的異常:CSV 數據源不支持 map<string,string> 數據類型。

我該如何以另一種方式做到這一點?

您需要將其作為字符串讀取,然后將其轉換為 MapType。 您可以在field3中將單引號替換為雙引號以獲得有效的json字符串,然后使用from_json function將其解析為map。

但是,從您的示例來看,文件中的值似乎沒有轉義,spark 將無法解析它,因為您在field3的值中有逗號,這也是分隔符。

一種方法是將其作為文本讀取,然后將{}內的逗號替換為另一個分隔符 say ; ,除以,得到 3 列並使用str_to_map function 將列field3轉換為 map:

val df = spark.text("/path/file.csv")

val result = df.withColumn(
    "value",
    split(regexp_replace(col("value"), ",(?=[^{}]*\\})", ";"), ",")
).select(
    col("value")(0).as("field1"),
    col("value")(1).as("field2"),
    regexp_replace(col("value")(2), "[{}' ]", "").as("field3")
).withColumn(
    "field3",
    expr("str_to_map(field3, ';', ':')")
)

result.show
//+------+------+------------------------+
//|field1|field2|field3                  |
//+------+------+------------------------+
//|aaa   |bbb   |[foo -> xxx, bar -> zzz]|
//+------+------+------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM