如何在 Spark SQL 中表达十六进制文字?

lee*_*wah 4 hive apache-spark-sql

我是 Spark SQL 新手。我搜索了Hive/SparkSQL 的语言手册并用 google 搜索答案,但找不到明显的答案。

0xffff在 MySQL 中,我们可以像这样表达十六进制文字:

mysql>select 0+0xffff;
+----------+
| 0+0xffff |
+----------+
|    65535 |
+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

但在 Spark SQL 中(我使用的是 beeline 客户端),我只能执行以下操作,其中数值以十进制而不是十六进制表示。

> select 0+65535;
+--------------+--+
| (0 + 65535)  |
+--------------+--+
| 65535        |
+--------------+--+
1 row selected (0.047 seconds)
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作,则会出现错误:

> select 0+0xffff;
Error: org.apache.spark.sql.AnalysisException: 
cannot resolve '`0xffff`' given input columns: []; line 1 pos 9;
'Project [unresolvedalias((0 + '0xffff), None)]
+- OneRowRelation$ (state=,code=0)
Run Code Online (Sandbox Code Playgroud)

我们如何在 Spark SQL 中表达十六进制文字?

zav*_*lin 5

不幸的是,您无法在 Spark SQL 中执行此操作。

只需查看ANTLR 语法文件即可发现它。在那里,number通过DIGIT词法分析器规则定义的规则如下所示:

number
  : MINUS? DECIMAL_VALUE            #decimalLiteral
  | MINUS? INTEGER_VALUE            #integerLiteral
  | MINUS? BIGINT_LITERAL           #bigIntLiteral
  | MINUS? SMALLINT_LITERAL         #smallIntLiteral
  | MINUS? TINYINT_LITERAL          #tinyIntLiteral
  | MINUS? DOUBLE_LITERAL           #doubleLiteral
  | MINUS? BIGDECIMAL_LITERAL       #bigDecimalLiteral
  ;

...

INTEGER_VALUE
  : DIGIT+
  ;

...

fragment DIGIT
  : [0-9]
  ;
Run Code Online (Sandbox Code Playgroud)

它不包含任何十六进制字符,因此您无法使用它们。