![](/img/trans.png)
[英]In spark Data frame how to convert Date column of type string to Date column of type Date using scala
[英]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.