带有自定义架构的Spark读取实木复合地板

时间:2018-09-18 12:51:04

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

我正在尝试使用自定义架构以镶木地板格式导入数据,但它返回: TypeError:option()缺少1个必需的位置参数:“值”

   ProductCustomSchema = StructType([
        StructField("id_sku", IntegerType(), True),
        StructField("flag_piece", StringType(), True),
        StructField("flag_weight", StringType(), True),
        StructField("ds_sku", StringType(), True),
        StructField("qty_pack", FloatType(), True)])

def read_parquet_(path, schema) : 
    return spark.read.format("parquet")\
                             .option(schema)\
                             .option("timestampFormat", "yyyy/MM/dd HH:mm:ss")\
                             .load(path)

product_nomenclature = 'C:/Users/alexa/Downloads/product_nomenc'
product_nom = read_parquet_(product_nomenclature, ProductCustomSchema)

1 个答案:

答案 0 :(得分:0)

如评论中所述,您应将.option(schema)更改为.schema(schema)option()要求您指定key(要设置的选项的名称)和value(要为该选项分配的值)。之所以得到TypeError,是因为您只是向schema传递了一个名为option的变量,而没有指定实际上要使用该变量设置的选项。

由于您在QueryExecutionException变量中定义的架构与DataFrame中的数据不匹配,因此引发了您在注释中发布的schema。如果要指定自定义架构,则必须确保该架构与您正在读取的数据匹配。在您的示例中,列id_sku存储为BinaryType,但是在您的架构中,您将列定义为IntegerTypepyspark不会尝试协调您提供的架构与数据中实际类型之间的差异,并且会引发异常。

要解决错误,请确保定义的架构正确地表示了存储在镶木地板文件中的数据(即,将架构中的id_sku的数据类型更改为BinaryType)。这样做的好处是,不必在每次读取镶木地板文件时都推断文件模式,从而可以稍微提高性能。