使用spark.read.format(“com.crealytics.spark.excel”)的inferSchema推断日期类型列

时间:2017-08-16 12:35:13

标签: excel python-3.x apache-spark pyspark pyspark-sql

我正在使用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

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

我可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

插件的作者:)

推断列类型为done in the plugin itself。 那段代码是taken from spark-csv。从代码中可以看出,目前只推断出String,Numeric,Boolean和Blank单元格类型。

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

第二个最佳选择是手动指定架构,类似于@addmeaning所描述的。请注意,我刚刚发布了版本0.9.0 makes some required parameters optionalchanges the way the path to the file needs to be specified

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")

答案 1 :(得分:0)

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

    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")

答案 2 :(得分:0)

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

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)