好的,这是一个非常肮脏的解决方法,但仍然可以解决问题。我仍在等待 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},$);