Csv 如何从“a”推断模式;参考文件;并将其作为要读入的文件的引用?

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

我有大量的csv文件要读取到Spark(Databricks)中,有100多列。我不想手动指定模式,并考虑使用以下方法。读入一个“reference”csv文件,从该文件中获取模式,并将其作为“reference_schema”应用于我需要读入的所有其他文件。代码如下所示(但我无法让它工作)

接下来,我将应用mySchema作为新csv的参考模式,如以下示例所示:

# 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)