scala - 从 spark/scala 中的 s3 读取时,分区 id 被隐式转换
问题描述
我在 s3 中有源数据,我的 spark/scala 应用程序将读取这些数据并在将其分区到新列后将其写入为镶木地板文件partition_id
。的值partition_id
将通过从另一个具有字母数字字符串值的 id 列中获取前两个字符来派生。例如:
id = 2dedfdg34h, partition_id = 2d
将数据写入 s3 后,将为每个分区创建单独的分区文件夹,一切看起来都很好。例如:
PRE partition_id=2d/
PRE partition_id=01/
PRE partition_id=0e/
PRE partition_id=fg/
PRE partition_id=5f/
PRE partition_id=jk/
PRE partition_id=06/
PRE partition_id=07/
但是当我再次将这些 s3 文件读入数据帧时,像 , 等值1d
会2d
被转换为1.0
, 2.0
。
火花版本:2.4.0
请就如何避免这种隐式转换提出建议。
用于向/从 s3 写入和读取分区数据的命令:
dataframe.write.partitionBy("partition_id").option("compression", "gzip").parquet(<path>)
spark.read.parquet(<path>)
解决方案
这里的问题是 Spark 错误地推断出分区列的列类型是数字。这是由于一些实际的值是数字(Spark 不会查看所有这些值)。
为了避免这种情况,您可以做的只是在读取数据时关闭分区列的自动类型推断。这将为您提供所需的原始字符串值。这可以按如下方式完成:
spark.conf.set("spark.sql.sources.partitionColumnTypeInference.enabled", "false")
推荐阅读
- mysql - 在尝试验证我的登录时,我收到错误“处理程序调度失败;嵌套异常是 java.lang.StackOverflowError”
- python - 数据框的方法是否会跳过行?
- sql - Hive - 当表的结果为零时如何显示警告消息
- android - 将参数传递给导航主机片段
- c++ - struct 成员默认初始化的区别
- firefox - Firefox 不允许永久访问您的屏幕
- python - 如何在网页上查找元素名称或 ID?
- django - Django 过滤视图集,需要对所有过滤行进行注释。按“全部”分组?
- firebase - 是否可以将图像添加到 Firebase 动态链接?
- html - Jquery float pie:改变标题出现的方式