Spark SQL 中的 ARRAY_TO_STRING

Posted

技术标签:

【中文标题】Spark SQL 中的 ARRAY_TO_STRING【英文标题】:ARRAY_TO_STRING in Spark SQL 【发布时间】:2018-05-02 01:59:45 【问题描述】:

PostgreSQL 的ARRAY_TO_STRING() 函数可以让你运行

SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');

给你

array_to_string

-----------------
1,2,3,*,5
(1 row)

我们可以使用 Spark SQL 做同样的事情吗?

我真正需要的是有一个 JSON 结构作为字符串保留。 谢谢!

【问题讨论】:

【参考方案1】:

不写udf 可以得到的最接近的东西是concat_ws

from pyspark.sql import functions as F

rdd = sc.parallelize([""""foo": 1.0, "bar": [1, 2, 3, null, 5]"""])

spark.read.json(rdd).withColumn("bar", F.concat_ws(",", "bar")).show()
# +-------+---+
# |    bar|foo|
# +-------+---+
# |1,2,3,5|1.0|
# +-------+---+  

但如您所见,它忽略了空值。使用udf,您可以

@F.udf
def array_to_string(xs, sep, nafill):
    return sep.join(str(x) if x is not None else str(nafill) for x in xs)

spark.read.json(rdd).withColumn("bar", array_to_string("bar", F.lit(","), F.lit("*"))).show()
# +---------+---+
# |      bar|foo|
# +---------+---+
# |1,2,3,*,5|1.0|
# +---------+---+

但如果:

我真正需要的是有一个 JSON 结构作为字符串保留

然后不要全部解析。例如,如果您使用 JSON 阅读器:

from pyspark.sql.types import *

(spark.read
    .schema(StructType([StructField("foo", StringType()), StructField("bar", StringType())]))
    .json(rdd)
    .show())
# +---+--------------+
# |foo|           bar|
# +---+--------------+
# |1.0|[1,2,3,null,5]|
# +---+--------------+

【讨论】:

以上是关于Spark SQL 中的 ARRAY_TO_STRING的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL 中找不到 Hive 表 - Cloudera VM 中的 spark.sql.AnalysisException

Spark改进|Apache Spark 3.0中的SQL性能改进概览

Spark-sql 中的 NullPointerException

如何解决 Spark 中的“aggregateByKey 不是 org.apache.spark.sql.Dataset 的成员”?

spark sql 中的结构化数据

Spark SQL 中的更新查询