我正在尝试将没有标头的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)
我得到的输出是:
这是怎么回事?如果我没有定义任何架构,它将完美地加载数据,但是我既没有机会指定标头也没有指定数据类型。
答案 0 :(得分:1)
我上传了一个示例csv文件来测试您的脚本,其内容如下。
1,Company-A,2019-09-30,10.01
2,Company-B,2019-09-29,20.02
然后,我尝试成功地重现您的问题,如下图所示,并且我认为该问题是由结构字段company
的错误类型引起的。
因此,我尝试对字段StringType
使用IntegerType
而不是company
,然后它可以正常工作,如下图所示。
同时,如果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,如下代码和图所示。< / 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)