使用pyspark处理csv文件中字段内的逗号

时间:2016-02-23 06:44:50

标签: csv apache-spark pyspark

我有一个csv数据文件,其中包含列值中的逗号。例如,

value_1,value_2,value_3  
AAA_A,BBB,B,CCC_C  

这里,值是“AAA_A”,“BBB,B”,“CCC_C”。但是,当试图用逗号分割行时,它给了我4个值,即“AAA_A”,“BBB”,“B”,“CCC_C”。

如何在PySpark中用逗号分隔行后得到正确的值?

3 个答案:

答案 0 :(得分:3)

使用数据库中的spark-csv类。

默认情况下(")之间引号之间的分隔符将被忽略。

示例:

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .option("inferSchema", "true") // Automatically infer data types
    .load("cars.csv")

有关详细信息,请查看https://github.com/databricks/spark-csv

如果你的引用是(')的实例("),你可以配置这个类。

编辑:

对于python API:

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('cars.csv')

最好的问候。

答案 1 :(得分:2)

如果您不介意额外的软件包依赖项,可以使用Pandas来解析CSV文件。它处理内部逗号就好了。

依赖关系:

from pyspark import SparkContext
from pyspark.sql import SQLContext
import pandas as pd

立即将整个文件读入Spark DataFrame:

sc = SparkContext('local','example')  # if using locally
sql_sc = SQLContext(sc)

pandas_df = pd.read_csv('file.csv')  # assuming the file contains a header
# If no header:
# pandas_df = pd.read_csv('file.csv', names = ['column 1','column 2']) 
s_df = sql_sc.createDataFrame(pandas_df)

或者,更有数据意识的是,您可以将数据块化为Spark RDD然后DF:

chunk_100k = pd.read_csv('file.csv', chunksize=100000)

for chunky in chunk_100k:
    Spark_temp_rdd = sc.parallelize(chunky.values.tolist())
    try:
        Spark_full_rdd += Spark_temp_rdd
    except NameError:
        Spark_full_rdd = Spark_temp_rdd
    del Spark_temp_rdd

Spark_DF = Spark_full_rdd.toDF(['column 1','column 2'])

答案 2 :(得分:0)

我(真的)是Pyspark的新手,但过去几年一直在使用Pandas。我要放在这里的内容可能最终并不是最好的解决方案,但是它对我有用,因此我认为值得在这里发布。

在加载带有特殊逗号的CSV文件时遇到同样的问题,如果使用Pyspark,则触发错误,但如果使用Pandas,则没有问题。因此,我到处寻找解决此额外定界符的解决方案,以下代码段解决了我的问题:

df = sqlContext.read.format('csv').option('header','true').option('maxColumns','3').option('escape','"').load('cars.csv')

我个人希望强制'maxColumns'参数仅允许特定数量的列。因此,如果将“ BBB,B”解析为两个字符串,spark将发出错误消息并为您打印整行。 “转义” 选项确实可以解决我的问题。我不知道这是否有帮助,但是希望可以进行实验。