我有一些大的(~150GB)csv文件,使用分号作为分隔符。我发现一些字段包含html编码的符号和&
分号被用作列分隔符,因此我需要找到一种方法来转义它,或者在加载数据帧时用&
替换&
例如,我有以下csv文件:
ID;FirstName;LastName
1;Chandler;Bing
2;Ross & Monica;Geller
我使用以下笔记本加载它:
df = spark.read.option("delimiter", ";").option("header","true").csv('/mnt/input/AMP test.csv')
df.show()
我得到的结果是:
+---+---------+--------+
| ID|FirstName|LastName|
+---+---------+--------+
| 1| Chandler| Bing|
| 2|Ross &| Monica|
+---+---------+--------+
而我要找的是:
+---+-------------+--------+
| ID| FirstName|LastName|
+---+-------------+--------+
| 1| Chandler| Bing|
| 2|Ross & Monica| Geller|
+---+-------------+--------+
我尝试过使用.option("escape", "&")
,但这种转义只对单个字符有效
更新
我有一个使用RDD的黑客解决方案,它至少适用于小测试文件,但我仍在寻找一个合适的解决方案,在加载数据帧时转义字符串
rdd = sc.textFile('/mnt/input/AMP test.csv')
rdd = rdd.map(lambda x: x.replace('&', '&'))
rdd.coalesce(1).saveAsTextFile("/mnt/input/AMP test escaped.csv")
df = spark.read.option("delimiter", ";").option("header","true").csv('/mnt/input/AMP test escaped.csv')
df.show()
我认为没有办法仅使用
spark.read.csv
来逃避这个复杂的字符&
,解决方案就像你做了“变通”一样:rdd.map
:此函数已将所有列中的值&
替换为&
csv
参数传递:您可以直接使用数据帧来实现这一点。如果您知道至少有一个文件不包含任何
&
来检索架构,那么它会有所帮助假设存在这样一个文件,并且其路径为“valid.csv”
结果如下:
相关问题 更多 >
编程相关推荐