У меня есть DataFrame в PySpark со столбцом строки запроса URI (StringType), например:
+--------------+
| cs_uri_query |
+--------------+
| a=1&b=2&c=3 |
+--------------+
| d&e=&f=4 |
+--------------+
Мне нужно преобразовать этот столбец в ArrayType элементов StructField со следующей структурой:
ArrayType(StructType([StructField('key', StringType(), nullable=False),
StructField('value', StringType(), nullable=True)]))
Мой ожидаемый столбец такой:
+------------------------------------------------------------+
| cs_uri_query |
+------------------------------------------------------------+
| [{key=a, value=1},{key=b, value=2},{key=c, value=3}] |
+------------------------------------------------------------+
| [{key=d, value=null},{key=e, value=null},{key=f, value=4}] |
+------------------------------------------------------------+
UDF - единственный способ, который я нашел для достижения этой цели. Я использую чистые функции Spark и, если это возможно, я бы хотел избежать UDF ... UDF имеют очень плохую производительность в PySpark, в отличие от использования Spark на Scala lang.
Это мой код используя UDF:
def parse_query(query):
args = None
if query:
args = []
for arg in query.split("&"):
if arg:
if "=" in arg:
a = arg.split("=")
if a[0]:
v = a[1] if a[1] else None
args.append({"key": a[0], "value": v})
else:
args.append({"key": arg, "value": None})
return args
uri_query = ArrayType(StructType([StructField('key', StringType(), nullable=True),
StructField('value', StringType(), nullable=True)]))
udf_parse_query = udf(lambda args: parse_query(args), uri_query)
df = df.withColumn("cs_uri_query", udf_parse_query(df["cs_uri_query"]))
Кто-нибудь смог мне открыть глаза с помощью удивительного решения?