首页 > 解决方案 > 尝试在 Azure Databricks DBFS 中导入 CSV 时出现 NULL 值

问题描述

我正在尝试将没有标头的 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)

我得到的输出是:

数据块输出

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

标签: pythoncsvpysparkdatabricksazure-databricks

解决方案


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

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

然后,我尝试成功重现您的问题,如下图所示,我认为该问题是由 struct field 的类型不正确引起的company

在此处输入图像描述

所以我尝试使用StringType而不是IntegerTypefor field company,然后它工作正常,如下图所示。

在此处输入图像描述

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

在此处输入图像描述

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

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

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

    在此处输入图像描述

  2. 首先使用pandaspackage 从 Azure Databricks 上的文件路径读取 csv 文件dbfs,然后从 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)
    

    在此处输入图像描述


推荐阅读