从csv

时间:2018-08-21 12:07:00

标签: apache-spark pyspark na

此刻我正在将PySpark 2.3.1与Python 3.6.6结合使用。

我需要使用。?作为NA的.csv文件。我想让PySpark直接将?识别为NA,因此可以对其进行处理。

我在nullValue=中尝试过spark.read.csv参数,但没有成功,而且我不确定是否与参数使用不当或?字符有问题有关在那种情况下(我尝试过nullValue='?'nullValue='\?')。

已经阅读了PySpark API文档,并尝试将pd.read_csv的熊猫na_values=?进行相同的操作,我想说 task("assembleAll") { dependsOn("assembleQa","assembleRelease") } 中有一些东西使它无法工作,但感觉可以告诉我我是否错了。

我该怎么办?

编辑:

该文件是UCI的成人数据集:http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

1 个答案:

答案 0 :(得分:1)

问题很可能是由您的null值周围的空格引起的。最简单的情况是前导/后继空格的数量是固定的(即,如果总是一个空格,后跟问号" ?")。在这种情况下,只需设置nullValue=' ?'

如果空格的数量不固定,则可能的解决方案是使用ignoreLeadingWhiteSpaceignoreTrailingWhiteSpace标志。 (假设您可以忽略所有值(包括非null)的前导/尾随空格。

例如,如果您的文件如下:

col1,col2,col3,col4
1, ?,a,xxx
? ,5,b,yyy
7,8,?,zzz

其中?null字符,但是它可以有尾随空格或前导空格,您可以按以下方式阅读它:

df = spark.read.csv(
    "path/to/my/file",
    header=True,
    nullValue='?',
    ignoreLeadingWhiteSpace=True,
    ignoreTrailingWhiteSpace=True,
    inferSchema=True
)

这将导致以下DataFrame:

df.show()
#+----+----+----+----+
#|col1|col2|col3|col4|
#+----+----+----+----+
#|   1|null|   a| xxx|
#|null|   5|   b| yyy|
#|   7|   8|null| zzz|
#+----+----+----+----+

如您所见,null值在正确的位置。

此外,由于我们设置了inferSchema=True,因此数据类型也正确:

df.printSchema()
#root
# |-- col1: integer (nullable = true)
# |-- col2: integer (nullable = true)
# |-- col3: string (nullable = true)
# |-- col4: string (nullable = true)