2

我正在尝试在 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(并为每个字段分配“字符串”类型)。

读取 header.tsv 很简单,也可以将其放入类型的记录header_record = {"header1": string, "header2":string, ....}中。但是,如何将 jaql记录header_record 转换为schema: 类型的对象schema_json = schema {"header1":string,"header2":string, ....}

4

1 回答 1

1

好的,这是一个非常肮脏的解决方法,但仍然可以解决问题。我仍在等待 IBM 支持以“规范方式”回复我(尽管我怀疑这是否存在):

一、定义头文件的路径

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) 现在, usingschemaof(schema_record)返回一个模式。哪个好。但是,我不明白为什么模式函数会做这样的事情,但模式记录看起来像"header1": @{const: "some string", fixed: 11} string而不是预期的"header1": string. 因此,这种“模式”几乎毫无用处。更糟糕的是,似乎没有办法操纵该模式对象,以便可以删除@{}规范。

解决方法:使用 function 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”和“fixed”记录elementsOf的模式将强制回退到“原始”模式(没有@{})

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},$);
于 2015-07-01T19:43:29.803 回答