使用 spark.read.format("com.crealytics.spark.excel") 的 inferSchema 正在为日期类型列推断 double
inferSchema using spark.read.format("com.crealytics.spark.excel") is inferring double for a date type column
我正在使用 PySpark(Python 3.6 和 Spark 2.1.1)并尝试使用 [=32] 从 excel 文件中获取数据=]spark.read.format("com.crealytics.spark.excel"),但它正在为日期类型列推断 double。
示例:
输入-
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 无法推断日期类型。您可以手动指定架构并将 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")
插件作者在这里:)
推断列类型是 done in the plugin itself。
该代码是 taken from spark-csv。从代码中可以看出,目前仅推断出字符串、数字、布尔和空白单元格类型。
最好的选择是创建一个使用 the corresponding DateUtil API.
正确推断日期列的 PR
第二好的选择是手动指定架构,类似于@addmeaning 描述的方式。请注意,我刚刚发布了 makes some required parameters optional and changes the way the path to the file needs to be specified.
版本 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")
指定架构可能会解决此问题。
from pyspark.sql.types import *
schema = StructType([StructField("Name", StringType(), False),
StructField("Age", DoubleType(), False),
StructField("Gender", StringType(), False),
StructField("DateOfApplication", DateType(), True)])
Add schema to 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)
我正在使用 PySpark(Python 3.6 和 Spark 2.1.1)并尝试使用 [=32] 从 excel 文件中获取数据=]spark.read.format("com.crealytics.spark.excel"),但它正在为日期类型列推断 double。
示例:
输入-
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 无法推断日期类型。您可以手动指定架构并将 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")
插件作者在这里:)
推断列类型是 done in the plugin itself。 该代码是 taken from spark-csv。从代码中可以看出,目前仅推断出字符串、数字、布尔和空白单元格类型。
最好的选择是创建一个使用 the corresponding DateUtil API.
正确推断日期列的 PR第二好的选择是手动指定架构,类似于@addmeaning 描述的方式。请注意,我刚刚发布了 makes some required parameters optional and changes the way the path to the file needs to be specified.
版本 0.9.0yourSchema = 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")
指定架构可能会解决此问题。
from pyspark.sql.types import *
schema = StructType([StructField("Name", StringType(), False),
StructField("Age", DoubleType(), False),
StructField("Gender", StringType(), False),
StructField("DateOfApplication", DateType(), True)])
Add schema to 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)