我有一个数据框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(...)