如何将unicode转换为数据框列的字符串?

时间:2019-01-11 10:43:17

标签: python apache-spark pyspark pyspark-sql unicode-string

我有一个火花数据框,其中有一个列'X'。该列包含以下形式的元素:

  

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

。如何将这个unicode转换为list。这就是我的输出应该是

  

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

。我已将其应用于“ X”列中的每个元素。

我尝试了df.withColumn(“ X_new”,ast.literal_eval(x))并收到错误

  

“格式错误的字符串”

我也尝试过

  

df.withColumn(“ X_new”,json.loads(x))并收到错误消息“ Expected   字符串或缓冲区”

  

df.withColumn(“ X_new”,json.dumps(x))表示不是JSON   可序列化的。

还有

  

df_2 = df.rdd.map(lambda x:x.encode('utf-8'))表示rdd没有   属性编码。

我不想使用collect和toPandas(),因为它会占用内存。(但是如果那是唯一的方法,请告诉我)。我正在使用Pyspark

更新:cph_sto使用UDF给出了答案。虽然效果很好,但我发现它很慢。有人可以建议其他方法吗?

2 个答案:

答案 0 :(得分:2)

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|
+--------------------+---+

OP要求的Q的扩展名-

# 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|
+--------------------+---+-----------+

答案 1 :(得分:-1)

请使用以下代码忽略Unicode

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