java - Spark:写入镶木地板文件时不理解的行为 - 数据类型
问题描述
我有这样的 csv 记录:
---------------------------
name | age | entranceDate |
---------------------------
Tom | 12 | 2019-10-01 |
---------------------------
Mary | 15 | 2019-10-01 |
我从 CSV 读取它并使用自定义模式将其转换为 DataFrame:
public static StructType createSchema() {
final StructType schema = DataTypes.createStructType(Arrays.asList(
DataTypes.createStructField("name", DataTypes.StringType, false),
DataTypes.createStructField("age", DataTypes.StringType, false),
DataTypes.createStructField("entranceDate", DataTypes.StringType, false)
));
return schema;
}
sqlContext.read()
.format("com.databricks.spark.csv")
.option("inferSchema", "false")
.option("delimiter", FIELD_DELIMITER)
.option("header", "false")
.schema(schema)
.load(pathToMyCsvFile);
现在我想将此数据框写入我的 hdfs 上的镶木地板:
String[] partitions =
new String[] {
"name",
"entranceDate"
};
df.write()
.partitionBy(partitions)
.mode(SaveMode.Append)
.parquet(parquetPath);
但是当我在 spark-shell 中检查镶木地板的架构时:
sqlContext.read.parquet("/test/parquet/name=Tom/entranceDate=2019-10-01/").printSchema()
它显示entranceDate
is 类型Date
。我想知道那是怎么回事?我已经指定这个字段应该是String
,它如何自动转换为Date
?
--------------
编辑:我做了一些测试,发现只有在我.partitionBy(partitions)
写作时它才会转换为日期。如果我删除此行并打印架构,它将显示类型entranceDate
为String
解决方案
我会说这是因为自动模式推断机制。Spark文档页面说
请注意,分区列的数据类型是自动推断的。目前支持数字数据类型、日期、时间戳和字符串类型。
有时用户可能不想自动推断分区列的数据类型。对于这些用例,自动类型推断可以通过 配置
spark.sql.sources.partitionColumnTypeInference.enabled
,默认为true
。
推荐阅读
- android - setCustomView 不适用于 android studio 中的 tablayout
- javascript - 将动态创建的切片字符串与其他切片字符串进行比较达到限制?
- c++ - Opencv:相同的捕获代码在高端笔记本电脑上提供低 FPS,在 TX1 上提供高 FPS
- ruby - 抓取网页:需要数据分隔符
- asp.net - 中继器中的链接第一次仅在更新面板控件内工作
- azkaban - 阿兹卡班执行错误
- python - AttributeError:使用后端 random_uniform 时,“张量”对象没有属性“_keras_history”
- c - 如何将 libc_nano 与 Clang 一起使用?
- ruby-on-rails - 为什么 Ruby on Rails 执行“SELECT 1 AS one”查询?
- angular - 类型 'Year' 不能分配给类型 'Year[]'。“年份”类型中缺少属性“包含”