我正在尝试在JAQL中实现以下功能并且卡住了。
我有两个文件:文件data.tsv,其中包含制表符分隔的数据,以及文件header.tsv,其中只包含一个带有制表符分隔值的行,对应于文件data.tsv的“标题”。
我想要实现的是使用以下方法读取data.tsv:
read(lines(location='data.tsv')) -> transform catch(delToJson($, {"schema": schema_json, "delimiter": "\t"}), {"errThresh":99999999999},$);
为此我需要schema_json,一个模式定义。我想从文件header.tsv创建这个schema_json(并为每个字段分配“string”类型)。
阅读header.tsv是直截了当的,并将其放入header_record = {"header1": string, "header2":string, ....}
类型的记录中。但是,如何将jaql 记录 header_record转换为类型为 schema的对象: schema_json = schema {"header1":string,"header2":string, ....}
?
答案 0 :(得分:1)
好的,这是一个非常肮脏的解决方法,但仍然可以解决问题。我仍在等待IBM支持人员以规范的方式回复我#34; (虽然我怀疑这是否存在):
首先,定义头文件的路径
HeaderFilePath = '/data/column_headers.tsv';
然后读取头文件。输出是一个数组。
HeaderFile = localRead(del(location=HeaderFilePath, delimiter = "\t"));
现在我构造了两个与HeaderFile数组长度相同的数组,以便在下一步中将它们与arrayToRecord
一起使用。为什么我构建两个而不仅仅是一个将在以后显而易见。
val_array = HeaderFile -> expand -> transform 'some string';
val_array2 = HeaderFile -> expand -> transform 'some other string';
我们的想法是使用与数据相同的模式构建一个人工记录schema_record,然后通过schemaof
获取模式,然后可以将其用作模式输入以读取数据文件。
为此,可以使用
schema_record = arrayToRecord(HeaderFile -> expand,val_array)
问题:
a)schemaof(schema_record)
返回schema { * }?
。这是因为模式(看似)只能从物化数据中推断出来,即必须使用schema_record := arrayToRecord(HeaderFile -> expand,val_array)
。
b)现在,使用schemaof(schema_record)
返回架构。这很好。但是,我不明白为什么模式函数会做这样的事情,但模式记录看起来像"header1": @{const: "some string", fixed: 11} string
而不是预期的"header1": string
。因此这个"架构"几乎没用。更糟糕的是,似乎无法操纵该架构对象,因此可能会删除@{}
规范。
解决方法:使用函数elementsOf
,它返回模式数组元素的模式。含义:
elementsOf([schemaof({a:1,b:3}),{a:1,b:3}]);
>> schema {"a":@{const: 1, fixed: 1} long, "b":@{const: 3, fixed: 1} long}.
但是,使用具有不同" const"的模式。和#34;固定"记录将迫使elementsOf
回归到" raw"架构(没有@ {})
elementsOf([schemaof({a:1,b:3}),{a:45,b:32}])
>> schema {"a": long, "b": long}.
这是"脏的解决方法"我用来实现我想要的。 (所有这一切都归因于对模式的理解非常奇怪......)
schema_array := [arrayToRecord(HeaderFile -> expand, val_array),arrayToRecord(HeaderFile -> expand, val_array2)];
DataSchema := elementsOf(schemaof(schema_array));
Data = read(lines(location='/data/data.tsv')) -> transform catch(delToJson($,
{"schema": DataSchema, "delimiter": "\t"}), {"errThresh": 99999999999},$);