我试图将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技能非常有限,所以任何帮助都会受到赞赏。
答案 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()
的效果是将字符串数组转换为字符串对象。
感谢所有回复的人 - 我学到了一些将来会派上用场的东西。