簡體   English   中英

在 Java 中使用 Apache 方解石解析 Bigquery 字符串(離線)

[英]Parse Bigquery string (offline) using Apache calcite in Java

我需要一些關於使用方解石解析 Bigquery 字符串的幫助,我是 Apache 方解石的新手,所以請耐心等待我做任何愚蠢的事情。

我的目標是解析 Bigquery SQL 字符串(即 Bigquery 表達式或 Bigquery SQL)。 如果語法有問題,應該通過錯誤。 但是下面的表達式是有效的,字符串我收到錯誤。

到目前為止,我做了以下事情:

創建 maven 項目后,我在 pom 中添加了以下依賴項:

        <dependency>
            <groupId>org.apache.calcite</groupId>
            <artifactId>calcite-core</artifactId>
            <version>1.32.0</version>
        </dependency>

這是我的代碼:

    public static void main(String[] args){
        String expr = "ROUND(((DATE_DIFF(cust360_customer_demographics.acct_eff_dt,todays_dt,DAY))/30),1)";
        String sql = "select avg(a) as \"avg_a\",b from csv.test group by b";
        System.out.println(validateExprCalcite(expr));
        //System.out.println(validateQueryCalcite(sql));
    }
    /* public static String validateQueryCalcite(String sql) {

        try {
            SqlParser expParser = getCalciteConfig(sql);
            SqlNode sqlNode = expParser.parseQuery();
            log.info("Validating Query - {}. After Query {}",sql,sqlNode.toSqlString(BigQuerySqlDialect.DEFAULT));
        } catch (Exception e) {
            return e.getCause().getMessage();
        }

        return "Query Successfully validated.";
    }
    */

    public static String validateExprCalcite(String sql) {

        try {
            SqlParser expParser = getCalciteConfig(sql);
            SqlNode sqlNode = expParser.parseExpression();
            log.info("Validating Query - {}. After Query {}",sql,sqlNode.toSqlString(BigQuerySqlDialect.DEFAULT));
        } catch (Exception e) {
            return e.getCause().getMessage();
        }

        return "Query Successfully validated.";
    }

    public static SqlParser getCalciteConfig(String sql){
        SqlParser.Config config = SqlParser.Config.DEFAULT
                .withLex(Lex.BIG_QUERY)
                .withConformance(SqlConformanceEnum.BIG_QUERY)
                .withParserFactory(SqlParserImpl.FACTORY)
                .withQuoting(Quoting.DOUBLE_QUOTE)
                .withUnquotedCasing(Casing.TO_UPPER)
                .withLex(Lex.BIG_QUERY);
        return SqlParser.create(sql, config);
    }

Incorrect syntax near the keyword 'DAY' at line 1, column 71.錯誤。盡管這是有效的 Big Query 表達式。

我還檢查了一些這樣的表達式,盡管它們是有效的 BQ 表達式,但它使用相同的表達式失敗了。

我錯過了什么嗎? 我在這里做錯了什么?

任何幫助將不勝感激。 謝謝!

我猜方解石中還沒有對DATE_DIFF的支持。 參見CALCITE-5180

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM