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

时间:2018-03-24 04:19:49

标签: apache-spark

我试图将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转换为字符串列表。此视图的一列的片段类似于

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

我希望将这些转换为

"992, 704, 721, 705", "", "105"
在写入csv之前分别

- 抑制结果字符串中的空格就可以了。我的Spark / Scala技能非常有限,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

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

要回答Ramesh的问题,有问题的变量是array(string)类型,其中数组的单个元素是WrappedArray。因此,最终工作的实际呼叫的模拟如下。代码在Zeppelin 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()的效果是将字符串数组转换为字符串对象。

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