我正在尝试将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()
的作用是将字符串数组转换为字符串对象。
感谢所有回复的人 - 我学到了一些将来会派上用场的东西。