我有一个数据框df,其中包含一列类型为array的数据
df.show()看起来像

|ID|ArrayOfString|Age|Gender|
+--+-------------+---+------+
|1 | [A,B,D]     |22 | F    |
|2 | [A,Y]       |42 | M    |
|3 | [X]         |60 | F    |
+--+-------------+---+------+

我尝试将df转储到csv文件中,如下所示:
val dumpCSV = df.write.csv(path="/home/me/saveDF")

由于列ArrayOfString,它不起作用。我得到错误:



如果删除列ArrayOfString,则该代码有效。但是我需要保留ArrayOfString!

转储包含列ArrayOfString的csv数据帧的最佳方法是什么(ArrayOfString应该作为CSV文件的一列转储)

最佳答案

出现此错误的原因是csv文件格式不支持数组类型,您需要将其表示为字符串才能保存。

尝试以下方法:

import org.apache.spark.sql.functions._

val stringify = udf((vs: Seq[String]) => vs match {
  case null => null
  case _    => s"""[${vs.mkString(",")}]"""
})

df.withColumn("ArrayOfString", stringify($"ArrayOfString")).write.csv(...)

要么

import org.apache.spark.sql.Column

def stringify(c: Column) = concat(lit("["), concat_ws(",", c), lit("]"))

df.withColumn("ArrayOfString", stringify($"ArrayOfString")).write.csv(...)

07-25 20:25