ARRAY_TO_STRING в Spark SQL - PullRequest
       21

ARRAY_TO_STRING в Spark SQL

0 голосов
/ 02 мая 2018

Функция 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 Ответ

0 голосов
/ 02 мая 2018

Самая близкая вещь, которую вы можете получить, не написав 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 reader:

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]|
# +---+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...