此刻我正在将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
答案 0 :(得分:1)
问题很可能是由您的null
值周围的空格引起的。最简单的情况是前导/后继空格的数量是固定的(即,如果总是一个空格,后跟问号" ?"
)。在这种情况下,只需设置nullValue=' ?'
。
如果空格的数量不固定,则可能的解决方案是使用ignoreLeadingWhiteSpace
和ignoreTrailingWhiteSpace
标志。 (假设您可以忽略所有值(包括非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)