微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Apache Spark 加载时以科学格式存储在 Hive 表中的小数

如何解决从 Apache Spark 加载时以科学格式存储在 Hive 表中的小数

我在使用 hive 表时遇到问题,其中十进制数(例如 0.00000000000)存储为 0E-11。即使它们代表相同的值 0,我也不明白为什么它以科学格式存储。这是用于数值计算的百分比字段之一,因此十进制数的比例应该很高。即使它是科学格式,它也不会以任何方式影响我们的计算。我们能够进行数字运算,但科学格式的表示可能会给使用此表的人带来一些困惑。此问题仅在百分比为 0 时发生。在其他存在有效百分比(如 0.123456789)的情况下,该值将按原样存储,没有任何 epsilon。

你能解释一下为什么 0.00000000000 用科学格式表示吗?另外,我想知道如何在没有像 0.00000000000 这样的 epsilon 的情况下按原样存储十进制数。出于我们的目的,我们希望解决方案仅使用 Hive 查询语言 (HQL),因为我们有一个框架,可以接收 hql 文件并将 hql 文件的结果写入 hive 表。

为了演示这个问题,我按照以下步骤操作。

  1. 我创建了一个带有小数和字符串列的临时表。
  2. 它使用镶木地板作为文件格式。
  3. 插入 0.00000000000 作为字符串和十进制 (12,11)。
  4. 同时显示列,并且都以科学格式显示
  5. 尝试使用 parquet-tools 检查文件内容,但即使在 parquet 文件中,它也存储在 科学格式。
  6. 也尝试使用纯文本格式,但行为相同。

Spark-shell screenshot

parquet-tools screenshot

我使用 Spark 2.3 运行。我查看了各种 StackOverflow 线程,例如 thisthisthis,但它们使用 Spark Dataframe API 来保留自然数格式,但我希望解决方案是基于 HQL .

如果有任何问题,请告诉我。

解决方法

我认为 format_number 函数应该可以为您解决问题。

请看下面的帖子

How to show decimal point in hive?

感谢用户 https://stackoverflow.com/users/4681341/vk-217?tab=profile

我检查了它,它正在工作。

select format_number(0.00000000000,11);

注意:没有足够的声誉来发表评论,因此在此处将其添加为答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。