apache-spark - 当我从 COBOL 文件中读取十进制值时,它们为 NULL
问题描述
我正在尝试读取 COBOL 文件。我有定义如下的字帖:
10 P1 PIC X(02).
10 P2 PIC X(15).
10 P3 PIC X(01).
10 P4 PIC X(01).
10 P5 PIC X(01).
10 P6 PIC X(01).
10 P7 PIC X(01).
10 P8 PIC S9(06)V99.
10 P9 PIC S9(06)V99.
10 P10 PIC S9(06)V99.
10 P11 PIC S9(06)V99.
10 P12 PIC S9(06)V99.
10 P13 PIC S9(06)V99.
10 P14 PIC S9(06)V99.
10 P15 PIC S9(06)V99.
10 P16 PIC S9(06)V99.
10 P17 PIC S9(06)V99.
10 P18 PIC S9(06)V99.
p8
through中的值p18
包含带符号的十进制值,但是当我检查结果表时,它们显示为NULL
.
我尝试过的事情:
我将其更改S9(06)V99
为:
S9(06)V99 USAGE COMP
NULL
仍然显示S9(06)V99 USAGE COMP-3
Spark
工作停止S9(06)V99 USAGE COMP-6
Spark
工作停止
我也尝试将值更改为String
( PIC X(20)
) 但仍然没有运气。
有什么帮助吗?
注意:正如您所见,我所有的尝试都是使用 COBOL 结构,可能是我可以用我的 SCALA 代码做的一些事情?
编辑 1
val df = ss.read.format("za.co.absa.cobrix.spark.cobol.source")
.option("copybook", Util.getProperty("hdfs_dir") + "/" + Util.getProperty("copyBook"))
.option("schema_retention_policy", "collapse_root")
.load("s3a://my-S3-location/");
编辑 2
根据我从朋友那里收到的一个建议,我将以下选项添加到SparkSession
:
.option("floating_point_format", "IBM")
我也尝试了@mazaneicha 的建议:
.option("encoding", "ascii")
更多细节
该程序能够读取常规十进制(我有几列具有常规十进制),但是有符号十进制的问题
解决方案
从文件中读取数据时,切勿在 cobol 中将变量声明为 numeric(9),而是将变量声明为字母数字 (X)。
为了进一步计算,使用FUNCTION NUMVAL将变量转换为数字
示例:结果 = 函数编号 (P8)。
推荐阅读
- reactjs - IE 11“预期:”使用 React Babel 7 Typescript
- sql - 从字符串中获取前 n 个字符写入它们并继续获取接下来的 n 个字符并写入它们
- angular6 - 在 Ionic 4 中使用硬件后退按钮的正确方法是什么?
- html - 我正在编写一个网站。背景图像的 URL 在 CSS 样式表中。我无法显示图像
- javascript - 奇怪的行为 Socket.io 和 React with hooks
- html - Chrome 不支持`font-family: "Arial Bold"`?
- javascript - Webix UI - 如何将 ui 小部件(输入、选择、日期选择器)值清除/重置/取消设置为空?
- tensorflow - 将模型从 colab 转换为 tf.keras h5 模型的问题
- ios - 如何从远程推送通知中获取 APNS 有效负载?
- python - 使用非重叠窗口将函数映射到容器