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

时间:2019-09-29 17:52:59

标签: python csv pyspark databricks azure-databricks

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

我得到的输出是:

Databricks Output

这是怎么回事?如果我没有定义任何架构,它将完美地加载数据,但是我既没有机会指定标头也没有指定数据类型。

1 个答案:

答案 0 :(得分:1)

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

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

然后,我尝试成功地重现您的问题,如下图所示,并且我认为该问题是由结构字段company的错误类型引起的。

enter image description here

因此,我尝试对字段StringType使用IntegerType而不是company,然后它可以正常工作,如下图所示。

enter image description here

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

enter image description here

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

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

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

    enter image description here

  2. 使用pandas包从Azure Databricks上的dbfs文件路径读取csv文件,然后从pandas数据帧创建Spark DataFrame,如下代码和图所示。< / p>

    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)
    

    enter image description here