inferSchema使用spark.read.format(“com.crealytics.spark.excel”)推断datetypes列的double

我正在PySpark( Python 3.6和Spark 2.1.1 )上工作,并尝试使用spark.read.format(“com.crealytics.spark.excel”)从excel文件中获取数据,但是推断出datetypes为double柱。

例:

input –

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 

而数据集的读取date或任何其他数值正在转换为双(date的特殊问题是,它完全改变了难以恢复到原来的date的值。

我可以帮忙吗?

这里的插件的作者:)

推断列types是在插件本身完成的 。 该代码是从spark-csv中获取的 。 从代码中可以看到,目前只推断出String,Numeric,Boolean和Blank单元格types。

最好的select是通过使用相应的DateUtil API来创build一个适当地推断date列的PR。

第二好的select是手动指定模式,类似于@addmeaning所描述的。 请注意,我刚刚发布了0.9.0版本,它使一些必需的参数成为可选项,并更改了指定文件path的方式 。

 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不能推断Datetypes。 您可以手动指定模式并将DateOfApplication作为string读取,然后将其转换为date。 以这种方式阅读你的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")