如何在sparksql中表示十六进制文本?

a14dhokn  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(312)

我对sparksql还不熟悉。我在语言手册中搜索了hive/sparksql并在google上搜索了答案,但没有找到明显的答案。
在mysql中,我们可以表示十六进制文本 0xffff 这样地:

mysql>select 0+0xffff;
+----------+
| 0+0xffff |
+----------+
|    65535 |
+----------+
1 row in set (0.00 sec)

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

> select 0+65535;
+--------------+--+
| (0 + 65535)  |
+--------------+--+
| 65535        |
+--------------+--+
1 row selected (0.047 seconds)

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

> 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)

如何在sparksql中表示十六进制文本?

mqkwyuun

mqkwyuun1#

不幸的是,你不能在sparksql中这么做。
您可以通过查看antlr语法文件来发现它。在那里,那个 number 通过定义的规则 DIGIT lexer规则如下所示:

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]
  ;

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

相关问题