从Spark写入镶木地板时如何处理空值

时间:2018-05-03 17:19:46

标签: apache-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 - 没有把一些标记值放入并让我的代码检查它(这很不方便且容易出错)。

2 个答案:

答案 0 :(得分:5)

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

问题在于null根本没有任何类型信息

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

根据commentMichael Armbrust所有你需要做的就是施放:

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

,结果可以安全地写入Parquet。

答案 1 :(得分:0)

我为此编写了一个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'))