将包含多个包装数组列的 Spark SQL 视图写入 CSV 失败



我正在尝试将Spark SQL中的视图写入CSV文件,但是失败了,因为我的视图中有几列WrappedArray类型。我收到的错误消息是

java.lang.UnsupportedOperationException:CSV 数据源不支持数组数据类型。

用于在 Zeppelin 2.7 上的 %spark shell 中写入文件的代码(修改以避免泄露数据的性质)是

spark.table("my_view").repartition(1).write.mode("overwrite").option("header", "true").csv("hdfs://path/to/my_output.csv")

我假设我需要在写入 csv 之前将包装数组转换为字符串列表。此视图的一列的代码段如下所示

WrappedArray(992, 704, 721, 705), null, WrappedArray(105)

我希望这些转换为

"992, 704, 721, 705", "", "105"

分别在写入 CSV 之前 - 抑制结果字符串中的空格是可以的。我的Spark/Scala技能非常有限,所以任何帮助将不胜感激。

我需要在Spark SQL中使用成语concat_ws(",", varname) as varname来执行一个select语句,用于我有一个字符串数组的20个左右实例中的每一个,其中单个字符串是WrappedArray。

为了回答 Ramesh 的问题,所讨论的变量是 array(string) 类型,其中数组的单个元素是 WrappedArray。因此,最终工作的实际调用的模拟如下。代码位于齐柏林飞艇 2.7.x 笔记本中。

%spark
import org.apache.spark.sql.functions concat_ws
val my_data spark.read.parquet(<path_to_file>).createOrReplaceTempView("dat")
%sql
create or replace temp view dat2 as
select var1, var2, concat_ws(",", var3) as var3, var4 from dat
where <stuff happens>

concat_ws()的作用是将字符串数组转换为字符串对象。

感谢所有回复的人 - 我学到了一些将来会派上用场的东西。

最新更新