Как прочитать файл 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
Редактировать:
Не полагаясь на блоки данных, я могу думать только о более сложном решении - это может быть не лучшим подходом:
- Заменить запятые в числах точками
- Разделить, используя оставшиеся запятые
Таким образом, вы можете сохранить свой оригинальный код и добавить замену 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 также избавляет от двойных кавычек.