我正在使用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(日期的特殊问题是它完全改变了很难恢复到原始日期的值。
我可以帮忙吗?
答案 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 optional和changes 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)