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

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

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

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

.如何将此 unicode 转换为列表。我的输出应该是

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

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

我试过 df.withColumn("X_new", ast.literal_eval(x)) 并得到错误

"Malformed String"

我也试过

df.withColumn("X_new", json.loads(x)) and got the error "Expected String or Buffer"

df.withColumn("X_new", json.dumps(x)) which says JSON not serialisable.

还有

df_2 = df.rdd.map(lambda x: x.encode('utf-8')) which says rdd has no attribute encode.

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

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

最佳答案

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

关于python - 如何将 unicode 转换为数据框列的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144887/

相关文章:

apache-spark - 在 Spark 2.1.0 中启用 _metadata 文件

apache-spark - PySpark - 将所有数据框列字符串拆分为数组

python - 将单应性应用于整个图像后,如何将2D点转换回去?

python - 为什么控制台卡在我用 python 解决 9X9 数独板的最后一个函数上?

python - 在所有不符合条件的行上过滤 Pandas 数据框

dataframe - pySpark - 在滚动窗口中获取最大值行

python - PyQt5 更改 native 对话框保存文本?

java - 如何使用 JavaSparkContext 处理来自 Kafka 的记录中带有文件名的文件?

apache-spark - 计算pyspark中每组成对连续行之间的时间差

apache-spark - 使用的 YARN vCores : Spark on YARN