apache-spark - 从 CSV 读取字符串数组作为 Pyspark 中的数组
问题描述
我有一个csv
包含这样数据的文件
ID|Arr_of_Str
1|["ABC DEF"]
2|["PQR", "ABC DEF"]
我想读取这个.csv
文件,但是当我使用时sqlContext.read.load
,它正在读取它作为字符串
当前的:
df.printSchema()
root
|-- ID: integer (nullable = true)
|-- Arr_of_Str: string (nullable = true)
预期的:
df.printSchema()
root
|-- ID: integer (nullable = true)
|-- Arr_of_Str: array (nullable = true)
|-- element: string (containsNull = true)
如何将字符串转换为字符串数组?
解决方案
更新:
实际上,您可以简单地from_json
将列解析Arr_of_Str
为字符串数组:
from pyspark.sql import functions as F
df2 = df.withColumn(
"Arr_of_Str",
F.from_json(F.col("Arr_of_Str"), "array<string>")
)
df1.show(truncate=False)
#+---+--------------+
#|ID |Arr_of_Str |
#+---+--------------+
#| 1 |[ABC DEF] |
#| 2 |[PQR, ABC DEF]|
#+---+--------------+
老答案:
读取数据时不能这样做,因为 CSV 中不支持复杂的数据结构。加载 DataFrame 后,您必须进行转换。
只需从字符串中删除数组方括号并将其拆分以获得数组列。
from pyspark.sql.functions import split, regexp_replace
df2 = df.withColumn("Arr_of_Str", split(regexp_replace(col("Arr_of_Str"), '[\\[\\]]', ""), ","))
df2.show()
+---+-------------------+
| ID| Arr_of_Str|
+---+-------------------+
| 1| ["ABC DEF"]|
| 2|["PQR", "ABC DEF"]|
+---+-------------------+
df2.printSchema()
root
|-- ID: string (nullable = true)
|-- Arr_of_Str: array (nullable = true)
| |-- element: string (containsNull = true)
推荐阅读
- javascript - 基于endWith的html动态dropwon菜单
- c - 关于hackerrank中的字典和地图问题
- node.js - 为什么我的 Node.js/Express 应用程序没有从我的 MongoDB 数据库返回记录?
- html - 通过其类和 id 自定义 html 元素
- javascript - 如何抽象不同模块的事件
- javascript - dc.js Vue 渲染图表不正确
- c - 反映cs50。试图反映图像,但只交换第一行像素
- python - 出于某种原因,我删除 RT 的正则表达式无法正常工作
- python - 获取位置字符串的最后一个单词,“纽约”、“北达科他州”、“南卡罗来纳州”等特殊情况除外
- ios - 适用于 iOS 的 Azure DevOps Pipeline - Fastlane 匹配克隆问题