Как я могу преобразовать Unicode в строку столбца данных? - PullRequest
0 голосов
/ 11 января 2019

У меня есть фрейм данных spark, в котором есть столбец «X». Столбец содержит элементы в форме:

и '[23,4,77,890,455, ................]

. Как я могу преобразовать этот Unicode в список. То есть мой вывод должен быть

[23,4,77,890,455 ...................]

. Я применил его для каждого элемента в столбце «X».

Я попробовал df.withColumn ("X_new", ast.literal_eval (x)) и получил ошибку

"Деформированная строка"

я тоже пробовал

df.withColumn ("X_new", json.loads (x)) и получил ошибку "Ожидается Строка или буфер "

и

df.withColumn ("X_new", json.dumps (x)), который говорит, что JSON не serialisable.

, а также

df_2 = df.rdd.map (лямбда-код x: x.encode ('utf-8')), который говорит, что rdd не имеет атрибут кодировать.

Я не хочу использовать collect и toPandas (), потому что он потребляет память. (Но, если это единственный способ, пожалуйста, сообщите). Я использую Pyspark

Обновление: cph_sto дал ответ, используя UDF. Хотя это сработало хорошо, я считаю, что это медленно. Может кто-нибудь предложить какой-нибудь другой метод?

Ответы [ 2 ]

0 голосов
/ 11 января 2019
import ast
from pyspark.sql.functions import udf
values = [(u'[23,4,77,890.455]',10),(u'[11,2,50,1.11]',20),(u'[10.05,1,22.04]',30)]
df = sqlContext.createDataFrame(values,['list','A'])
df.show()
+-----------------+---+
|             list|  A|
+-----------------+---+
|[23,4,77,890.455]| 10|
|   [11,2,50,1.11]| 20|
|  [10.05,1,22.04]| 30|
+-----------------+---+    

# Creating a UDF to convert the string list to proper list
string_list_to_list = udf(lambda row: ast.literal_eval(row))
df = df.withColumn('list',string_list_to_list(col('list')))
df.show()
+--------------------+---+
|                list|  A|
+--------------------+---+
|[23, 4, 77, 890.455]| 10|
|   [11, 2, 50, 1.11]| 20|
|   [10.05, 1, 22.04]| 30|
+--------------------+---+

Расширение Q, как указано в OP -

# Creating a UDF to find length of resulting list.
length_list = udf(lambda row: len(row))
df = df.withColumn('length_list',length_list(col('list')))
df.show()
+--------------------+---+-----------+
|                list|  A|length_list|
+--------------------+---+-----------+
|[23, 4, 77, 890.455]| 10|          4|
|   [11, 2, 50, 1.11]| 20|          4|
|   [10.05, 1, 22.04]| 30|          3|
+--------------------+---+-----------+
0 голосов
/ 11 января 2019

Пожалуйста, используйте код ниже, чтобы игнорировать Unicode

df.rdd.map(lambda x: x.encode("ascii","ignore"))
...