Spark CSV Чтение Игнорировать персонажей - PullRequest
0 голосов
/ 22 апреля 2020

Я использую Spark 2.2.1 через Zeppelin.

Прямо сейчас мой код чтения с искрой выглядит следующим образом:

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

Я заметил, когда Я использую функцию .show(), клетки смещены вправо. На CSV все ячейки находятся в правильных местах, но после прохождения Spark ячейки будут смещены вправо. Я смог определить виновника: цитаты неуместны. В файле CSV есть несколько ячеек, которые написаны так:

{TV, Inte rnet, Wi-Fi, "Кондиционер", Кухня, "Камин в помещении", Отопление, "Для семей / детей", Стиральная машина, сушилка}

Фактический вывод (обратите внимание, что я использовал .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          ||

Есть ли способ избавиться от цитат или заменить их апострофами? Апострофы не влияют на данные.

1 Ответ

0 голосов
/ 22 апреля 2020

Вам нужна функция regexp_replace с синтаксисом regexp_replace(str, pattern, replacement).

К сожалению, я не смог воспроизвести вашу проблему, так как не знал, как написать файл lists.csv.

Однако приведенный ниже пример должен дать вам представление о том, как заменить определенные шаблоны регулярных выражений при работе с фреймом данных в Spark.

Это отражает ваши исходные данные

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

Использование этой функции должно решить вашу проблему с проблемными символами c, заменив их. Не стесняйтесь использовать регулярные выражения в этой функции.

...