如何处理Spark SQL中缺少的列

时间:2018-08-09 16:27:00

标签: scala apache-spark apache-spark-sql

我们正在处理无模式的JSON数据,有时spark作业失败,因为我们在spark SQL中引用的某些列在一天的某些小时内不可用。在这些时间内,由于数据框中没有可用的引用列,因此火花作业失败。如何处理这种情况?我尝试了UDF,但是缺少太多列,因此无法真正检查每一列的可用性。我还尝试了在较大的数据集上推断模式,并将其应用于数据框,期望丢失的列将被填充为null,但模式应用程序会失败,并出现奇怪的错误。

请提出建议

3 个答案:

答案 0 :(得分:1)

这对我有用。创建了一个函数来检查所有预期的列,并在缺少数据列时将其添加到数据框中

def checkAvailableColumns(df: DataFrame, expectedColumnsInput: List[String]) : DataFrame = {
    expectedColumnsInput.foldLeft(df) {
        (df,column) => {
            if(df.columns.contains(column) == false) {
                df.withColumn(column,lit(null).cast(StringType))
            }
            else (df)
        }
    }
}

val expectedColumns = List("newcol1","newcol2","newcol3")

val finalDf = checkAvailableColumns(castedDateSessions,expectedColumns)

答案 1 :(得分:0)

以下是添加缺少的列的步骤:

text1

您可以遍历自动生成的架构。如果是平桌子,那就做 df.columns。 将找到的列与预期的列进行比较,并添加缺少的字段,如下所示:

text3

也许有一种更快的方法可以一次完成而不是一次添加丢失的列,但是使用CheckBoxes方法是私有的。

答案 2 :(得分:0)

这是一个基于answer的pyspark解决方案,它检查名称列表(从configDf-转换为应该包含的列列表-parameterColumnsToKeepList)-假定所有缺少的列都是整数,但是您可以也可以在configdDf中动态查找。我的默认值为null,但您也可以使用0。

from pyspark.sql.types import IntegerType

for column in parameterColumnsToKeepList: 
    if column not in processedAllParametersDf.columns:
      print('Json missing column: {0}' .format(column))
      processedAllParametersDf = processedAllParametersDf.withColumn(column, lit(None).cast(IntegerType()))