У меня есть столбец с несколькими парами значений ключа в виде строки.
Бывший:
rb=99;cs_y1=0;y2_co=CA;y2_r=ON;y2_ct=Kitchener;y2_z=N2N;y2_isp=Bell DSL Internet;y2_org=Bell DSL Internet
Мне нужно извлечь значения, соответствующие ключам y2_co, y2_r, y2_z и y2_org.
df.withColumn("co", split(split(col("_c1"), ";").getItem(2))," = ").getItem(1))
.withColumn("r", split(split(col("_c1"), ";").getItem(3))," = ").getItem(1))
.withColumn("z", split(split(col("_c1"), ";").getItem(5))," = ").getItem(1))
.withColumn("org", split(split(col("_c1"), ";").getItem(7)," = ").getItem(1))
У меня есть приведенное выше, которое работает для этой одной строки, но количество пар значений ключа не является постоянным. Как мне настроить приведенное выше выражение для обработки пар значений ключа переменной длины?
Используйте str_to_map, см. ниже:
from pyspark.sql import functions as F
keys = ["y2_co", "y2_r", "y2_z", "y2_org"]
df.withColumn('m', F.expr("str_to_map(_c1,';','=')")) \
.selectExpr("*", *[ f"m['{k}'] as `{k}`" for k in keys ]) \
.show()
+--------------------+--------------------+-----+----+----+-----------------+
| _c1| m|y2_co|y2_r|y2_z| y2_org|
+--------------------+--------------------+-----+----+----+-----------------+
|rb=99;cs_y1=0;y2_...|[rb -> 99, cs_y1 ...| CA| ON| N2N|Bell DSL Internet|
+--------------------+--------------------+-----+----+----+-----------------+
какая у тебя версия питона? если это до 3.6, вам нужно будет изменить f-строку на использование "m['{0}'] as {0}".format(k)
.
или измените selectExpr на .select("*", *[ F.col('m')[k].alias(k) for k in keys ])
Как мне выбрать только нужные столбцы, т.е. y2_co|y2_r|y2_z|y2_org. Можно ли сделать это при выборе?
просто удалите "*"
из списка выбора, например: .select([ F.col('m')[k].alias(k) for k in keys ])
.
@jxc есть ли способ сделать это без указания массива?
Спасибо, получаю ошибку .selectExpr("*", *[ f"m['{k}'] as
{k}
" для k в ключах ]) \ ^ SyntaxError: неверный синтаксис