我有一个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中用逗号分隔行后得到正确的值?
答案 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将发出错误消息并为您打印整行。 “转义” 选项确实可以解决我的问题。我不知道这是否有帮助,但是希望可以进行实验。