在数组结构列中更改顺序并添加新元素- SPARK SCALA

ccgok5k5  于 8个月前  发布在  Scala
关注(0)|答案(1)|浏览(59)

我有这个schema 1:

我尝试对结构体上的元素进行排序,并在schema 2中的任何位置添加一些新元素作为NULL:


我试过这个:

df.withColumn("sample",
    expr("transform(sample, x -> struct(x.elem1, x.elem2, 'NULL' as elem2, x.elem3,x.elem4, x.elem5, x.elem6 , x.elem7))"))

我得到了这个错误:
只有可折叠字符串表达式才允许出现在奇数位置,得到:NamePlaceholder,NamePlaceholder,NamePlaceholder,NamePlaceholder,NamePlaceholder,NamePlaceholder,NamePlaceholder;线1位置45;
有人帮忙吗?谢谢

mdfafbf1

mdfafbf11#

sparkSession.sql("select array(named_struct('elem4', 4, 'elem1', 1, 'elem2', 2)) sample").
      selectExpr("transform(sample, x -> named_struct('elem1', x.elem1, 'elem2', x.elem2, 'elem3', null, 'elem4', x.elem4)) sample_rewired").
      show()

作品制作:

+-----------------+
|   sample_rewired|
+-----------------+
|[{1, 2, null, 4}]|
+-----------------+

使用struct将为null引入生成的列名,因此:

sparkSession.sql("select array(named_struct('elem4', 4, 'elem1', 1, 'elem2', 2)) sample").
      selectExpr("transform(sample, x -> struct(x.elem1, x.elem2, null, x.elem4)) sample_rewired").
      selectExpr("explode(sample_rewired) no_array").selectExpr("no_array.*").
      show()

产量:

+-----+-----+----+-----+
|elem1|elem2|col3|elem4|
+-----+-----+----+-----+
|    1|    2|null|    4|
+-----+-----+----+-----+

因此,您需要通过named_struct指定名称。
至于你得到的错误,不知道,它看起来很奇怪。使用withColumn和expr也不会失败。你用的是什么Spark版本?

相关问题