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