Преобразовать тип строки в тип массива в spark sql - PullRequest
0 голосов
/ 10 января 2020

У меня есть таблица в Spark SQL в Databricks и столбцы в виде строки. Я преобразовал как новые столбцы как тип данных Array, но они все еще как одна строка. Тип данных - это тип массива в схеме таблицы

Column as String 
Data1 
[2461][2639][2639][7700][7700][3953]

Converted to Array 
Data_New
["[2461][2639][2639][7700][7700][3953]

Преобразование строки в массив

df_new = df.withColumn("Data_New", array(df["Data1"])) 

Затем запись в виде паркета и использование в качестве таблицы spark sql в кирпичах данных

Когда Я ищу строку, используя функцию array_contains. Я получаю результаты как ложные

select *
from table_name
where array_contains(Data_New,"[2461]")

Когда я ищу всю строку, запрос превращает результаты в истинные

Пожалуйста, предложите, если я могу отделить эти строки как массив и может найти любой массив, используя массив содержит функцию.

Ответы [ 3 ]

1 голос
/ 10 января 2020

Просто удалите начальные и конечные скобки из строки, затем разделите на ][, чтобы получить массив строк:

df = df.withColumn("Data_New", split(expr("rtrim(']', ltrim('[', Data1))"), "\\]\\["))
df.show(truncate=False)

+------------------------------------+------------------------------------+
|Data1                               |Data_New                            |
+------------------------------------+------------------------------------+
|[2461][2639][2639][7700][7700][3953]|[2461, 2639, 2639, 7700, 7700, 3953]|
+------------------------------------+------------------------------------+

Теперь используйте array_contains, например:

df.createOrReplaceTempView("table_name")

sql_query = "select * from table_name where array_contains(Data_New,'2461')"
spark.sql(sql_query).show(truncate=False)
0 голосов
/ 10 января 2020

импорт

from pyspark.sql import functions as sf, types as st

создание таблицы

a = [["[2461][2639][2639][7700][7700][3953]"], [None]]
sdf = sc.parallelize(a).toDF(["col1"])
sdf.show()
+--------------------+
|                col1|
+--------------------+
|[2461][2639][2639...|
|                null|
+--------------------+

тип преобразования

def spliter(x):
    if x is not None:
        return x[1:-1].split("][")
    else:
        return None
udf = sf.udf(spliter, st.ArrayType(st.StringType()))
sdf.withColumn("array_col1", udf("col1")).withColumn("check", sf.array_contains("array_col1", "2461")).show()
+--------------------+--------------------+-----+
|                col1|          array_col1|check|
+--------------------+--------------------+-----+
|[2461][2639][2639...|[2461, 2639, 2639...| true|
|                null|                null| null|
+--------------------+--------------------+-----+

0 голосов
/ 10 января 2020

На самом деле это не массив, это полная строка, поэтому вам нужно регулярное выражение или подобное

expr = "[2461]"
df_new.filter(df_new["Data_New"].rlike(expr))
...