USQL调用无需密钥即可读取json数组

时间:2018-08-21 12:40:22

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

我有一个嵌套的json,我想在usql中将其扁平化。我无法共享数据,但是结构与此类似。

{
    "userlist": [user1, user1],
    "objects": {
        "largeobjects": [object1, object2, object3]
        "smallobjects": [s_object1, s_object2]
    },
    "applications": [{
            "application": sdq3ds5dsa
        }, {
            "application": dksah122j4
        }, {
            "application": sadsw2dq2s
        }, {
            "application": pro3dfdsn3
        }
    ],
    "date" : 12344232,
    "timezone" : "Asia",
    "id" : "sad2ddssa2",
    "admin": {
        "lang": "eng",
        "country": "us",
    }
}

我正在使用自定义jsonoutputter(https://github.com/Azure/usql/tree/master/Examples/DataFormats/Microsoft.Analytics.Samples.Formats)从json文件中提取,并使用jsontuple函数来提取值。我的问题是该函数使用sql映射来生成键值对。这适用于我有键的情况,但是当我尝试使用该函数从无键数组获取值时会抛出错误。

任何有关如何解决此问题的建议将不胜感激。

编辑 这是我正在照顾的输出:

sad2ddssa2,object1,12344232,“亚洲”,“ eng”,“我们”,
sad2ddssa2,object2,12344232,“亚洲”,“ eng”,“我们”

2 个答案:

答案 0 :(得分:1)

第一个选项

尝试在您的u-sql中使用PROSE。使用PROSE的c#nuget处理数据并进行复杂的提取。这是一个非常强大的AI程序包。在此处查看视频和示例:https://microsoft.github.io/prose

第二个选项

创建一个c#函数来处理您的json。像这样的事情,使用c#json api将这个示例适应您的自定义提取请求:

/* Formats the array of values into a named json array. */

DECLARE @JsonArray Func<SqlArray<string>, string, string> = (data, name) => 
    {
        StringBuilder buffer = new StringBuilder();

        buffer.Append("{\r\n\t\"" + name + "\": [\r\n");

        for (int i = 0; i < data.Count(); i++)
        {
            if (i > 0)
            {
                buffer.Append(",\r\n");
            }

            buffer.Append("\t\"" + data[i] + "\"");
        }

        buffer.Append("\r\n\t]\r\n}");

        return buffer.ToString();
    };

/* Format the array containing groups of comma separated values into a named json array */

@Query = 
    SELECT
        @JsonArray(SubscriptionArray, "subscriptionList") AS JsonArray
    FROM @subscriptionsQuery1;

第三种选择

在适应您的需求后尝试以下方法:

/* For each json line create a json map (SqlMap) */

@subscriptionsQuery1 = 
    SELECT 
           JsonFunctions.JsonTuple(JsonLine) AS JsonMap
    FROM @SubscriptionsExtractor AS t;

/* For each json map get the required property value */

@subscriptionsQuery1 = 
    SELECT DISTINCT
           JsonMap["alias"] AS Subscription
    FROM @subscriptionsQuery1 AS t;

/* Join the value of all rows into a single row containing an array of all values */

@subscriptionsQuery1 = 
    SELECT
        ARRAY_AGG<string>(Subscription) AS SubscriptionArray
    FROM @subscriptionsQuery1 AS t;

答案 1 :(得分:1)

我能够使用NewtonSoft MultiLevelJsonExtractor提取器和this fixed-up JSON file来使其工作:

g_idle_add()

我的结果:

My results

我想说这可能比使用自行开发的方法更安全,因为NewtonSoft库专门用于处理JSON,并且已经过尝试和测试。