Csv 如何从“a”推断模式;参考文件;并将其作为要读入的文件的引用?
我有大量的csv文件要读取到Spark(Databricks)中,有100多列。我不想手动指定模式,并考虑使用以下方法。读入一个“reference”csv文件,从该文件中获取模式,并将其作为“reference_schema”应用于我需要读入的所有其他文件。代码如下所示(但我无法让它工作) 接下来,我将应用mySchema作为新csv的参考模式,如以下示例所示:Csv 如何从“a”推断模式;参考文件;并将其作为要读入的文件的引用?,csv,apache-spark,pyspark,databricks,Csv,Apache Spark,Pyspark,Databricks,我有大量的csv文件要读取到Spark(Databricks)中,有100多列。我不想手动指定模式,并考虑使用以下方法。读入一个“reference”csv文件,从该文件中获取模式,并将其作为“reference_schema”应用于我需要读入的所有其他文件。代码如下所示(但我无法让它工作) 接下来,我将应用mySchema作为新csv的参考模式,如以下示例所示: # File location and type file_location = "/FileStore/tables/a
# File location and type
file_location = "/FileStore/tables/all_other_files.csv"
file_type = "csv"
# CSV options
first_row_is_header = "True"
delimiter = ";"
# The applied options are for CSV files. For other file types, these will be ignored.
df = spark.read.format(file_type) \
.schema(mySchema) \
.option("header", first_row_is_header) \
.option("sep", delimiter) \
.load(file_location)
display(df)
这只会产生空值
提前感谢您的帮助和帮助
顺致敬意,
亚历克斯你的方法是正确的 您可以检查这两个选项
mode
和columnNameOfCorruptRecord
。默认情况下,mode=PERMISSIVE
,它在行与架构不匹配时创建空记录。
这可能就是为什么您的数据帧中有空记录,这意味着模式mySchema
和文件的模式所有其他文件都不同
首先要检查的是推断出所有其他文件的模式
,并将其与mySchema
进行比较。为了方便地做到这一点,schema
对象有一个json
方法,该方法将它们输出为json字符串。比较两个JSON比比较两个模式对象更容易
mySchema.json()
如果只有一个差异,很遗憾,整行将被设置为空。嗨,史蒂文,你似乎是对的。在一列中,所有值都属于不同的类型。奇怪的是,columnNameOfCorruptRecord没有显示在数据帧中。原始列均为NULL,但缺少附加的“损坏”列。有什么想法吗?@DocAl如果您没有设置任何内容,它将使用spark.sql.columnNameOfCorruptRecord
中指定的值。可能,该值也是空的,因此,输出中没有损坏的列。但您可以在选项中手动设置它。检查方法中可用的参数。我确实使用.option(“columnNameOfCorruptRecord”,“row_corrupt”)显式设置了它。可能无法显示,因为我正在使用架构?最好的Alex@DocAl显然,您需要将列添加到原始模式中mySchema.add(字段,数据类型=None,null=True,metadata=None)
。添加了字段,现在似乎可以工作了。仍然需要测试,但非常感谢Steven。最佳亚历克斯
# File location and type
file_location = "/FileStore/tables/all_other_files.csv"
file_type = "csv"
# CSV options
first_row_is_header = "True"
delimiter = ";"
# The applied options are for CSV files. For other file types, these will be ignored.
df = spark.read.format(file_type) \
.schema(mySchema) \
.option("header", first_row_is_header) \
.option("sep", delimiter) \
.load(file_location)
display(df)