尝试在 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
,结果如下图
顺便说一下,还有两个其他解决方案可以满足您的需求。
使用带schema
参数的spark.read.csv
函数读取无头csv文件,如下代码和图
df = spark.read.csv(file_location, schema='id INT, company STRING, date DATE, price DOUBLE')
display(df)
首先使用 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)
我正在尝试将没有 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
,结果如下图
顺便说一下,还有两个其他解决方案可以满足您的需求。
使用带
schema
参数的spark.read.csv
函数读取无头csv文件,如下代码和图df = spark.read.csv(file_location, schema='id INT, company STRING, date DATE, price DOUBLE') display(df)
首先使用
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)