使用 spark.read.format( "com.crealytics.spark.excel" ) 的 inferSchema 正在推断日期类型列的双精度



我正在研究PySpark(Python 3.6和Spark 2.1.1(,并尝试使用spark.read.format("com.crealytics.spark.excel"(从excel文件中获取数据,但它推断日期类型列的双精度。

例:

输入-

df = spark.read.format("com.crealytics.spark.excel").
option("location", "D:\Users\ABC\Desktop\TmpData\Input.xlsm").
option("spark.read.simpleMode","true"). 
option("treatEmptyValuesAsNulls", "true").
option("addColorColumns", "false"). 
option("useHeader", "true").  option("inferSchema", "true").
load("com.databricks.spark.csv")

结果:

Name | Age | Gender | DateOfApplication
________________________________________
X    | 12  |   F    |  5/20/2015
Y    | 15  |   F    |  5/28/2015
Z    | 14  |   F    |  5/29/2015

打印架构-

df.printSchema()
root
|-- Name: string (nullable = true)
|-- Age: double (nullable = true)
|-- Gender: string (nullable = true)
|-- DateOfApplication: double (nullable = true)

正在做 .show-

df.show()
Name | Age | Gender | DateOfApplication
________________________________________
X    | 12.0  |   F    |   42144.0
Y    | 15.0  |   F    |   16836.0
Z    | 14.0  |   F    |   42152.0

当读取数据集时,日期或任何其他数值被转换为双倍(日期的特殊问题是它完全改变了很难恢复到原始日期的值。

我可以得到帮助吗?

插件的作者在这里:)

推断列类型是在插件本身中完成的。 该代码取自spark-csv。从代码中可以看出,目前仅推断出字符串、数字、布尔和空白单元格类型。

最好的选择是创建一个 PR,该 PR 使用相应的 DateUtil API 正确推断日期列。

第二个最佳选项是手动指定架构,类似于@addmeaning描述的方式。请注意,我刚刚发布了版本 0.9.0,它使一些必需的参数成为可选参数,并更改了需要指定文件路径的方式。

yourSchema = StructType()
.add("Name", StringType(), True)
.add("Age", DoubleType(), True)
.add("Gender", StringType(), True)
.add("DateOfApplication", DateType(), True)
df = spark.read.format("com.crealytics.spark.excel").
schema(yourSchema).
option("useHeader", "true").
load("D:\Users\ABC\Desktop\TmpData\Input.xlsm")

Spark无法推断日期类型。您可以手动指定架构并将 DateOfApplication 读取为字符串,然后将其转换为日期。以这种方式阅读您的 df:

yourSchema = StructType()
.add("Name", StringType(), True)
.add("Age", DoubleType(), True)
.add("Gender", StringType(), True)
.add("DateOfApplication", StringType(), True)
df = spark.read.format("com.crealytics.spark.excel").
schema(yourSchema).
option("location", "D:\Users\ABC\Desktop\TmpData\Input.xlsm").
option("spark.read.simpleMode","true"). 
option("treatEmptyValuesAsNulls", "true").
option("addColorColumns", "false"). 
option("useHeader", "true").  //no infer schema
load("com.databricks.spark.csv")

指定架构可能会解决此问题。

from pyspark.sql.types import *
schema = StructType([StructField("Name", StringType(), False),
StructField("Age", DoubleType(), False),
StructField("Gender", StringType(), False),
StructField("DateOfApplication", DateType(), True)]) 

将架构添加到 spark.read。

df_excel= spark.read.
format("com.crealytics.spark.excel").
schema(schema).
option("useHeader", "true").
option("treatEmptyValuesAsNulls", "false").
option("inferSchema", "false"). 
option("addColorColumns", "false").
load(file_path)
display(df_excel)

最新更新