【问题标题】:U-SQL Query Error in Azure Data LakeAzure 数据湖中的 U-SQL 查询错误
【发布时间】:2018-03-07 17:27:58
【问题描述】:

我在 U-SQL 查询中遇到错误:

E_CSC_USER_SYNTAXERROR: syntax error. Expected one of: '.' ALL ANTISEMIJOIN ANY AS BROADCASTLEFT BROADCASTRIGHT CROSS DISTINCT EXCEPT FULL FULLCROSS GROUP HASH HAVING INDEXLOOKUP INNER INTERSECT JOIN LEFT LOOP MERGE ON OPTION ORDER OUTER OUTER UNION PAIR PIVOT PRESORT PRODUCE READONLY REQUIRED RIGHT SAMPLE SEMIJOIN SERIAL SORTED TO UNIFORM UNION UNIVERSE UNPIVOT USING WHERE WITH ';' '(' ')' ','
Line 19
Component
CSC
Message
syntax error. Expected one of: '.' ALL ANTISEMIJOIN ANY AS BROADCASTLEFT BROADCASTRIGHT CROSS DISTINCT EXCEPT FULL FULLCROSS GROUP HASH HAVING INDEXLOOKUP INNER INTERSECT JOIN LEFT LOOP MERGE ON OPTION ORDER OUTER OUTER UNION PAIR PIVOT PRESORT PRODUCE READONLY REQUIRED RIGHT SAMPLE SEMIJOIN SERIAL SORTED TO UNIFORM UNION UNIVERSE UNPIVOT USING WHERE WITH ';' '(' ')' ','
Resolution
Correct the script syntax, using expected token(s) as a guide.
Description
Invalid syntax found in the script.
Details
at token 'string', line 19
near the ###:
**************

    Custom string,
    ttl int
    FROM @INPUT_FILE
    USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("$.[*]");

@jsonnodes =
    Partition  ### string, 
    SELECT JsonApp.JsonFunctions.JsonTuple(System).Values AS system_array,
    SELECT JsonApp.JsonFunctions.JsonTuple(Custom).Values AS custom_array,

这是我的 u-sql 查询:

@json =
    EXTRACT 
    Partition string, 
    System string,
    Custom string,
    ttl int
    FROM @INPUT_FILE
    USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("$.[*]");

@jsonnodes =
    Partition string, 
    SELECT JsonApp.JsonFunctions.JsonTuple(System).Values AS system_array,
    SELECT JsonApp.JsonFunctions.JsonTuple(Custom).Values AS custom_array,
    ttl
    FROM @json;

我在提取 @jsonnodes 查询中的值时遇到错误。

另外,应该使用什么 json 路径来遍历 JSON 中的所有对象?

【问题讨论】:

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


    【解决方案1】:

    纠正西蒙的回答:

    原始脚本使用了无效语法(SELECT 或 EXTRACT 之外的列名/类型对,然后是单个查询中的多个 SELECT 子句):

    @jsonnodes =
      Partition string, 
      SELECT JsonApp.JsonFunctions.JsonTuple(System).Values AS system_array,
      SELECT JsonApp.JsonFunctions.JsonTuple(Custom).Values AS custom_array,
      ttl
      FROM @json;
    

    您可能只想选择已提取的列和单个表达式,因此您将名称(不带类型!)移动到 SELECT 语句中,并且只使用 one SELECT 子句如下:

    @jsonnodes =
    SELECT 
        Partition, 
        JsonApp.JsonFunctions.JsonTuple(System).Values AS system_array,
        JsonApp.JsonFunctions.JsonTuple(Custom).Values AS custom_array,
        ttl
    FROM @json;
    

    【讨论】:

      【解决方案2】:

      就像在 SQL 中一样,您只能在语句中使用 SELECT 一次,就像您对 EXTRACT 语句所做的那样,所以您的代码应该如下所示:

      @jsonnodes =
      SELECT 
          Partition string, 
          JsonApp.JsonFunctions.JsonTuple(System).Values AS system_array,
          JsonApp.JsonFunctions.JsonTuple(Custom).Values AS custom_array,
          ttl
      FROM @json;
      

      当您查看 JSON 路径示例 here 时,您会发现您可以使用 $..* 路径获取所有对象,或者仅使用 $[*] 获取第一级对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多