gpt4 book ai didi

azure - U-SQL 命名列时出错

转载 作者:行者123 更新时间:2023-12-03 01:05:31 25 4
gpt4 key购买 nike

我有一个 JSON,其中字段的顺序不固定。

即我可以有[A, B, C]或[B, C, A]

所有 A、B、C 都是 json 对象,其形式为 {Name: x, Value:y}。

因此,当我使用 USQL 提取 JSON(我不知道它们的顺序)并将其放入 CSV(我需要列名称)时:

@output =
SELECT
A["Value"] ?? "0" AS CAST ### (("System_" + A["Name"]) AS STRING),
B["Value"] ?? "0" AS "System_" + B["Name"],
System_da

因此,我尝试将列名称作为 JSON 中的“名称”字段。

但是我在上面的####处收到错误:

Message

syntax error. Expected one of: FROM ',' EXCEPT GROUP HAVING INTERSECT OPTION ORDER OUTER UNION UNION WHERE ';' ')'

Resolution
Correct the script syntax, using expected token(s) as a guide.

Description

Invalid syntax found in the script.

Details
at token '(', line 74
near the ###:
**************

我不允许“动态”放置正确的列名称,这是我的问题绝对必要的。

Input: [A, B, C,], [C, B, A]

Output: A.name B.name C.name
Row 1's values
Row 2's values

最佳答案

这个

@output =
SELECT
A["Value"] ?? "0" AS CAST ### (("System_" + A["Name"]) AS STRING),
B["Value"] ?? "0" AS "System_" + B["Name"],
System_da

不是一个有效的 SELECT 子句(无论是在 U-SQL 还是我所知道的任何其他 SQL 方言中)。

什么是 JSON 数组?它是键/值对吗?还是地位?或者您希望为数组中的单个值添加标记以表明它是否存在于数组中?

从你的例子来看,你似乎想要这样的东西:

输入:

[["A","B","C"],["C","D","B"]]

输出:

 A     B    C    D
true true true false
false true true true

如果是这样的话,我会写成:

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

@input =
SELECT "[[\"A\", \"B\", \"C\"],[\"C\", \"D\", \"B\"]]" AS json
FROM (VALUES (1)) AS T(x);

@data =
SELECT JsonFunctions.JsonTuple(arrstring) AS a
FROM @input CROSS APPLY EXPLODE( JsonFunctions.JsonTuple(json).Values) AS T(arrstring);

@data =
SELECT a.Contains("A") AS A, a.Contains("B") AS B, a.Contains("C") AS C, a.Contains("D") AS D
FROM (SELECT a.Values AS a FROM @data) AS t;

OUTPUT @data
TO "/output/data.csv"
USING Outputters.Csv(outputHeader : true);

如果您需要更动态的内容,请使用生成的 SqlArraySqlMap 或使用上述方法生成脚本。

但是,我想知道为什么您首先要以这种方式建模您的信息。我建议找到一种更合适的方法来标记 JSON 中值的存在。

更新:我错过了您关于内部数组成员是一个具有两个键值对的对象的评论,其中一个始终称为名称(用于属性),一个始终称为值用于适当的值(value)。所以这是该案例的答案。

第一:使用 {"Name": "propname", "Value": "value"} 对 JSON 中的键值对进行建模完全是对 JSON 灵活建模功能的滥用,不应该做完了。如果可以的话,请使用 {"propname": "value"} 来代替。

因此更改输入,以下将为您提供经过透视的值。请注意,您需要提前知道这些值,并且有多种关于如何进行透视的选项。我在创建新的 SqlMap 实例以减少过度建模的语句中执行此操作,然后在下一个 SELECT 中从 map 中获取值。

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

@input =
SELECT "[[{\"Name\":\"A\", \"Value\": 1}, {\"Name\": \"B\", \"Value\": 2}, {\"Name\": \"C\", \"Value\":3 }], [{\"Name\":\"C\", \"Value\": 4}, {\"Name\":\"D\", \"Value\": 5}, {\"Name\":\"B\", \"Value\": 6}]]" AS json
FROM (VALUES (1)) AS T(x);

@data =
SELECT JsonFunctions.JsonTuple(arrstring) AS a
FROM @input CROSS APPLY EXPLODE( JsonFunctions.JsonTuple(json)) AS T(rowid, arrstring);

@data =
SELECT new SqlMap<string, string>(
a.Values.Select((kvp) =>
new KeyValuePair<string, string>(
JsonFunctions.JsonTuple(kvp)["Name"]
, JsonFunctions.JsonTuple(kvp)["Value"])
)) AS kvp
FROM @data;

@data =
SELECT kvp["A"] AS A,
kvp["B"] AS B,
kvp["C"] AS C,
kvp["D"] AS D
FROM @data;

OUTPUT @data
TO "/output/data.csv"
USING Outputters.Csv(outputHeader : true);

关于azure - U-SQL 命名列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49362635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com