Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转换为长数据类型-BigQuery_Sql_Scala_Hbase_Google Bigquery_Hbase Client - Fatal编程技术网

Sql 转换为长数据类型-BigQuery

Sql 转换为长数据类型-BigQuery,sql,scala,hbase,google-bigquery,hbase-client,Sql,Scala,Hbase,Google Bigquery,Hbase Client,这里是BigQuery和SQLNoob。我正在研究大查询支持的可能数据类型。我在bigtable中有一列,它的类型是bytes,它的原始数据类型是scalaLong。这被转换为字节,并从我的应用程序代码存储在bigtable中。我试图在BigQuery UI中执行CAST(itemId为整数)(其中itemId是列名),但是CAST(itemId为整数)的输出是0而不是实际值。我不知道怎么做。如果有人能给我指出正确的方向,我将不胜感激 编辑:添加更多详细信息 示例itemId为190007788

这里是BigQuery和SQLNoob。我正在研究大查询支持的可能数据类型。我在bigtable中有一列,它的类型是
bytes
,它的原始数据类型是scala
Long
。这被转换为
字节
,并从我的应用程序代码存储在bigtable中。我试图在BigQuery UI中执行
CAST(itemId为整数)
(其中
itemId
是列名),但是
CAST(itemId为整数)
的输出是0而不是实际值。我不知道怎么做。如果有人能给我指出正确的方向,我将不胜感激

编辑:添加更多详细信息
示例
itemId
190007788462

下面是将
itemId
写入大表的代码。我已经包括了相关的方法。使用
hbase客户端
写入bigtable

import org.apache.hadoop.hbase.client._
def toPut(key: String, itemId: Long): Put = {
   val TrxColumnFamily = Bytes.toBytes("trx")
   val ItemIdColumn = Bytes.toBytes("itemId")
   new Put(Bytes.toBytes(key))
  .addColumn(TrxColumnFamily,
             ItemIdColumn,
             Bytes.toBytes(itemId))
}

下面是基于上述代码的大表中的条目

ROW COLUMN+CELL foo column=trx:itemId, value=\x00\x00\x00\xAFP]F\xAA }

上面的
getItemId
函数正确返回
itemId
。这是因为
Bytes.toLong
org.apache.hadoop.hbase.util.Bytes
的一部分,它正确地将字节字符串转换为Long

我使用的大查询UI类似于并使用
CAST(itemId为整数)
,因为BigQuery没有
Long
数据类型。这会将
itemId
字节字符串错误地强制转换为整数,结果值为
0

有没有办法在BigQueryUI中从
hbase客户端
获得一个
Bytes.toLong
等价物?如果没有,我还有别的办法解决这个问题吗?

试试这个:

SELECT CAST(CONCAT('0x', TO_HEX(itemId)) AS INT64) AS itemId
FROM YourTable;
它将字节转换为十六进制字符串,然后将该字符串转换为INT64。请注意,查询使用标准SQL,而不是传统SQL。如果要尝试使用一些示例数据,可以运行以下查询:

WITH `YourTable` AS (
  SELECT b'\x00\x00\x00\xAFP]F\xAA' AS itemId UNION ALL
  SELECT b'\xFA\x45\x99\x61'
)
SELECT CAST(CONCAT('0x', TO_HEX(itemId)) AS INT64) AS itemId
FROM YourTable;

请举例说明
itemId
看起来像什么,以及转换后的值应该是什么。我对这个值感到困惑:
\x00\x00\x00\xAFP]F\xAA
。假设
FP]F
也被解释为字节吗?值的其余部分是十六进制转义序列。我不明白如何将其解释为
190007788462
。这不是确切的itemId表示,但列的类型是bytesPerfect。这很有效。您是如何推断您需要
CONCAT('0x',to_HEX(itemId))
?我以前在执行字节操作时使用过这种模式。您可以将十进制字符串(例如
1234
)转换为INT64,也可以转换十六进制字符串(例如
0x04D2
)。因为有一个函数
TO_HEX
,所以可以得到一个十六进制字符串,在前面加上
0x
:)后可以转换该字符串。是否存在用于浮动的模式?我尝试了上面相同的模式,但没有成功。例如,我有
price
列,它存储为
float
类型的字节。示例
price
3.0
,在bigtable中我看到了
@\x02Q\xEB\x85\x1E\xB8R
(可能不是
3.0
的值)我认为也可以从十六进制表示转换为FLOAT64,但我不知道您会得到预期的结果,我不认为这个功能有文档记录。能够从十六进制字符串转换为FLOAT64是数字解析器的一个副作用,我认为这不是故意的。当然。我会试试的
WITH `YourTable` AS (
  SELECT b'\x00\x00\x00\xAFP]F\xAA' AS itemId UNION ALL
  SELECT b'\xFA\x45\x99\x61'
)
SELECT CAST(CONCAT('0x', TO_HEX(itemId)) AS INT64) AS itemId
FROM YourTable;