Spark CSV读取 忽略字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark CSV读取 忽略字符相关的知识,希望对你有一定的参考价值。

我正在通过Zeppelin使用Spark 2.2.1。

现在我的Spark读取代码如下。

val data = spark.read.option("header", "true").option("delimiter", ",").option("treatEmptyValuesAsNulls","true").csv("listings.csv")

我注意到当我使用 .show() 函数,单元格会向右移动。在CSV上,所有的单元格都在正确的位置上,但是通过Spark后,单元格会向右移动。我找到了罪魁祸首:引号把单元格放错了位置。在CSV文件中,有一些单元格是这样写的。

{TV,Internet,Wifi, "空调",厨房, "室内壁炉",暖气, "家庭儿童友好型",洗衣机,烘干机}。

实际输出(请注意,我用的是 .select() 并选取了一些列来显示我所遇到的问题)。)

|         description|           amenities|      square_feet|               price|
+--------------------+--------------------+-----------------+--------------------+
|This large, famil...|"{TV,Internet,Wif...|          Kitchen|""Indoor fireplace""|
|Guest room in a l...|   "{TV,""Cable TV""|         Internet|                Wifi|

预期的输出。

|         description|           amenities|      square_feet|               price|
+--------------------+--------------------+-----------------+--------------------+
|This large, famil...|"{TV,Internet,Wif...|       1400      |   $400.00          ||
|Guest room in a l...|   "{TV,""Cable TV""|       1100      |   $250.00          ||

有没有办法去掉引号或用引号代替?撇号似乎不会影响数据。

答案

你要找的是 regexp_replace 语法的函数 regexp_replace(str, pattern, replacement).

不幸的是,我无法重现你的问题,因为我不知道如何编写listing.csv文件。

不过,下面的例子应该能让你了解在Spark中处理数据框架时如何替换某些regex模式。

这反映了你的原始数据

data.show()

+-----------+----------+-----------+--------+
|description| amenities|square_feet|   price|
+-----------+----------+-----------+--------+
|'This large| famil...'|       '{TV|Internet|
+-----------+----------+-----------+--------+

使用regexp_replace,你可以替换可疑的字符串模式,比如说

import org.apache.spark.sql.functions.regexp_replace
data.withColumn("amenitiesNew", regexp_replace(data("amenities"), "famil", "replaced")).show()

+-----------+----------+-----------+--------+-------------+
|description| amenities|square_feet|   price| amenitiesNew|
+-----------+----------+-----------+--------+-------------+
|'This large| famil...'|       '{TV|Internet| replaced...'|
+-----------+----------+-----------+--------+-------------+

使用这个函数应该可以解决你的问题,将问题字符替换掉。在该函数中可以随意使用正则表达式。

以上是关于Spark CSV读取 忽略字符的主要内容,如果未能解决你的问题,请参考以下文章

Spark在字符串中使用逗号读取csv

Apache Spark (PySpark) 在读取 CSV 时处理空值

Spark忽略字符串中的逗号

即使在连接字符串中使用 HDR=No ,使用 OLEDB 读取 CSV 文件也会忽略第一行

使用跳过行在 Spark 中读取 csv

在 java spark 中从 REST API 读取 csv