从 Spark 写入 parquet 时如何处理空值



直到最近,parquet还不支持null值 - 这是一个值得怀疑的前提。事实上,最近的版本最终添加了该支持:

https://github.com/apache/parquet-format/blob/master/LogicalTypes.md

但是,spark还需要很长时间才能支持新的parquet功能 - 如果有的话。以下是相关的(closed - will not fix(JIRA:

https://issues.apache.org/jira/browse/SPARK-10943

那么,人们今天在dataframe的写出parquet时对空列值做了什么? 我只能想到非常丑陋的可怕黑客,比如写空字符串和..井。。我不知道如何处理数值来指示null- 除了输入一些哨兵值并让我的代码检查它(这很不方便且容易出错(。

您误解了 SPARK-10943。Spark 支持将null值写入数字列。

问题是null本身根本不携带任何类型信息

scala> spark.sql("SELECT null as comments").printSchema
root
|-- comments: null (nullable = true)

根据Michael Armbrust的评论,您所要做的就是投掷:

scala> spark.sql("""SELECT CAST(null as DOUBLE) AS comments""").printSchema
root
|-- comments: double (nullable = true)

并且结果可以安全地写入镶木地板。

我为此编写了一个 PySpark 解决方案(df是一个列为NullType的数据帧(:

# get dataframe schema
my_schema = list(df.schema)
null_cols = []
# iterate over schema list to filter for NullType columns
for st in my_schema:
if str(st.dataType) == 'NullType':
null_cols.append(st)
# cast null type columns to string (or whatever you'd like)
for ncol in null_cols:
mycolname = str(ncol.name)
df = df 
.withColumn(mycolname, df[mycolname].cast('string'))

最新更新