尝试在 Azure Databricks DBFS 中导入 CSV 时的 NULL 值

NULL values when trying to import CSV in Azure Databricks DBFS

我正在尝试将没有 headers 的 CSV 文件导入到 Azure Databricks 的 DBFS 中,但是,无论我是使用 UI 还是尝试通过代码来完成,输出显示所有四列的空值。

这是我的代码 运行:

from pyspark.sql.types import *

# File location and type
file_location = "/FileStore/tables/sales.csv"
file_type = "csv"

# Options

delimiter = ","

customSchema = StructType([\
    StructField("id", StringType(), True),\
    StructField("company", IntegerType(), True),\
    StructField("date", TimestampType(), True),\
    StructField("price", DoubleType(), True)])

# Dataframe from CSV
df = spark.read.format(file_type) \
    .schema(customSchema) \
    .option("sep", delimiter) \
    .load(file_location)

display(df)

我得到的输出是:

这里发生了什么?如果我没有定义任何模式,它会完美地加载数据,但是我没有机会既不指定 headers 也不指定数据类型。

我上传了一个示例csv文件来测试你的脚本,内容如下。

1,Company-A,2019-09-30,10.01
2,Company-B,2019-09-29,20.02

然后,我尝试重现你的问题,如下图,我认为问题是由于struct字段的类型不正确造成的company

所以我尝试在company字段中使用StringType而不是IntegerType,然后效果很好,如下图

同时,如果date字段的值只是一个日期,可以用DateType代替TimestampType,结果如下图

顺便说一下,还有两个其他解决方案可以满足您的需求。

  1. 使用带schema参数的spark.read.csv函数读取无头csv文件,如下代码和图

    df = spark.read.csv(file_location, schema='id INT, company STRING, date DATE, price DOUBLE')
    display(df)
    

  2. 首先使用 pandas 包从 Azure Databricks 上的 dbfs 文件路径读取 csv 文件,然后从 pandas 数据帧创建一个 Spark DataFrame,如下图和代码

    import pandas as pd
    df_pandas = pd.read_csv('/dbfs/FileStore/tables/sales.csv', header=None, names = ['id', 'company', 'date', 'price'])
    df = spark.createDataFrame(df_pandas)
    display(df)