Как прочитать файл CSV с запятыми в поле, используя pyspark?

У меня есть CSV-файл, содержащий запятые в значении столбца. Например,

Column1,Column2,Column3    
123,"45,6",789  

Значения заключаются в двойные кавычки, когда в данных есть лишние запятые. В приведенном выше примере значения Column1=123, Column2=45,6 и Column3=789 Но при попытке прочитать данные, я получаю 4 значения из-за лишней запятой в поле Column2.

Как получить правильные значения при чтении этих данных в PySpark? Я использую Spark 1.6.3

В настоящее время я делаю ниже, чтобы создать rdd, а затем фрейм данных из rdd.

rdd = sc.textFile(input_file).map(lambda line: line.split(','))
df = sqlContext.createDataFrame(rdd) 

1 ответ

Вы можете напрямую прочитать его в DF, используя SQLContext:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.read.format('com.databricks.spark.csv')
    .options(header='true', inferschema='true', quote='"', delimiter=',')
    .load(input_file)

Поскольку Delimiter ',' и Quote '"' являются значениями по умолчанию, вы также можете их опустить. Запятые внутри кавычек по умолчанию игнорируются. Описание параметров можно найти здесь: https://github.com/databricks/spark-csv

Редактировать:

Не полагаясь на блоки данных, я могу думать только о более сложном решении - это может быть не лучшим подходом:

  1. Заменить запятые в числах точками
  2. Разделить, используя оставшиеся запятые

Таким образом, вы можете сохранить свой оригинальный код и добавить замену REGEX

import re
rdd = sc.textFile(input_file).map(lambda line: (re.sub(r'\"(\d+),(\d+)\"',r'\1.\2', line)).split(','))
df.sqlContext.createDataFrame(rdd)

Поставляемый REGEX также избавляет от двойных кавычек.

Другие вопросы по тегам