【问题标题】:Query name and city using u-sql使用u-sql查询姓名和城市
【发布时间】:2018-11-11 11:24:49
【问题描述】:

我需要从嵌套 json 下方过滤名称和城市。

[
    {
        "Employee": [
            {
                "name": "John",
                "Gender": "Male"
            }
        ],
        "Info": {
            "location": {
                "city": "Kuvala",
                "continent": "Asia",
                "country": "Singapore"
            }
        }
    },
    {
        "Employee": [
            {
                "name": "Mike",
                "Gender": "Male"
            }
        ],
        "Info": {
            "location": {
                "city": "Dhabi",
                "continent": "Asia",
                "country": "Dubai"
            }
        }
    }
]

我的代码

CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM @"/Assemblies/Newtonsoft.Json.dll";
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM @"/Assemblies/Microsoft.Analytics.Samples.Formats.dll";

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

USING Microsoft.Analytics.Samples.Formats.Json;

DECLARE @InputFile string = @"/Source/example.blob";
DECLARE @output string = @"/Output/output.csv";

@json  =
    EXTRACT Employee String,
            Info String
    FROM @InputFile
    USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("*");

@CreateJSONTuple =
    SELECT   JsonFunctions.JsonTuple(Employee) AS EmployeeData,
             JsonFunctions.JsonTuple(Info) AS InfoData
    FROM @json;

@result =
    SELECT EmployeeData["name"] AS Name,
           JsonFunctions.JsonTuple(InfoData, "location") AS LocationData
    FROM @CreateJSONTuple;

OUTPUT @result
TO @output
USING Outputters.Csv(outputHeader : true, quoting : true);

我收到错误消息,说无法从 'Microsoft.Analytics.Types.Sql.SqlArray' 转换为 'string' 请帮忙。

请帮助我从中获取名称,城市。 这应该输出: 约翰·瓦拉拉 迈克·扎比

【问题讨论】:

  • 您好,我们需要您付出一些努力。到目前为止你的 U-sql 脚本是什么?如果您根本没有任何线索,互联网上有很多例子。先从这些开始。
  • 嗨@PeterBons,我已经更新了我的代码。我是新手,没有从初学者到专家级别的适当文档。这次请帮帮我。
  • 请帮忙..,,

标签: azure azure-sql-database azure-data-lake u-sql


【解决方案1】:

我认为您收到此错误是因为 Employee 元素的内容被定义为一个数组:

"Employee": [
        {
            "name": "Mike",
            "Gender": "Male"
        }
    ]

尝试将 Employee 元素更改为如下内容:

"Employee": {
            "name": "Mike",
            "Gender": "Male"
        }

更新

看来您可能需要对数组项执行 JsonTuple,所以这可能有效:

@result =
SELECT JsonFunctions.JsonTuple(EmployeeData[0])["name"] AS Name,
       JsonFunctions.JsonTuple(InfoData, "location") AS LocationData
FROM @CreateJSONTuple;

需要注意的是,如果 Employee 数组可能包含多个项目,您可能需要使用 Cross Apply Explode

更新 2

不幸的是,这是我能想到的最后一件事。尝试替换:

@CreateJSONTuple =
SELECT   JsonFunctions.JsonTuple(Employee) AS EmployeeData,
         JsonFunctions.JsonTuple(Info) AS InfoData
FROM @json;

@result =
SELECT EmployeeData["name"] AS Name,
       JsonFunctions.JsonTuple(InfoData, "location") AS LocationData
FROM @CreateJSONTuple;

有了这个:

@CreateJSONTuple =
SELECT   JsonFunctions.JsonTuple(Employee).Values AS EmployeeData,
         JsonFunctions.JsonTuple(Info) AS InfoData
FROM @json;
@result =
SELECT JsonFunctions.JsonTuple(employee)["name"] AS Name,
       JsonFunctions.JsonTuple(InfoData, "location") AS LocationData
FROM @CreateJSONTuple
CROSS APPLY
    EXPLODE(EmployeeData) AS employees(employee) ;

希望对你有帮助!

【讨论】:

  • 我无法更改,我获取的数据来自第三方。
  • EmployeeData[0]["name"] 的编译器错误:无法从 'int' 转换为 'string'
  • 我尝试了另一种方法,得到 EmployeeData["0"]["name"] 的编译器错误:无法从 'string' 转换为 'int'
  • 还是一样的异常:不能从'int'转换成'string'
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多