模式定义Spark读取

时间:2019-12-05 14:13:49

标签: apache-spark pyspark apache-spark-sql

读取具有已定义架构的CSV文件,我能够加载文件并进行处理,使用下面的代码可以正常工作。该模式被定义为严格遵循数据类型以准确记录精度。

source_schema = StructType([
            StructField("COL1", StringType(), True),
            StructField("COL2", StringType(), True),
            StructField("COL3", StringType(), True),
            StructField("COL4", StringType(), True),
            StructField("COL5", StringType(), True)])

df_raw_file = in_spark.read \
            .format("csv") \
            .option("delimiter", delimiter) \
            .option("header", "false") \
            .option("inferSchema", "true") \
            .option("columnNameOfCorruptRecord", "BAD_RECORD") \
            .schema(source_schema) \
            .load(file)

现在,我们收到的CSV文件将从明年开始省略几列,比方说,COL4以后将不再是该文件的一部分。但是我们应该能够处理这两个文件,因为如果需要的话,我们会重新处理旧文件,那么如何处理这样的要求。 我可能会使用df.columns阅读CSV获取列的CSV示例,并比较两个预定义的架构。如果还有其他选择,我可以帮助您会很有帮助。

1 个答案:

答案 0 :(得分:1)

如果将mode选项设置为PERMISSIVE,它将可以处理您的情况https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=read%20csv#pyspark.sql.DataFrameReader.csv

  

当记录遇到令牌少于令牌长度的记录时   模式,将null设置为多余的字段。