转换为long数据类型-bigquery

0ve6wy6x  于 2021-06-08  发布在  Hbase
关注(0)|答案(1)|浏览(596)

bigquery和sqlnoob在这里。我在这里讨论了大查询支持的可能的数据类型。我在bigtable中有一个类型为的列 bytes 它的原始数据类型是scala Long . 已将此转换为 bytes 并从我的应用程序代码中存储在bigtable中。我正在努力 CAST(itemId AS integer) (其中 itemId 是bigQueryUI中的列名称),但 CAST(itemId AS integer) 是0而不是实际值。我不知道怎么做。如果有人能给我指出正确的方向,我将不胜感激。
编辑:添加更多详细信息
样品 itemId190007788462 下面是编写 itemId 到大table上去。我已经包括了相关的方法。使用 hbase client 写入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

下面是从scala的大表中读取条目的相关代码。这是正确的。 Result 是一个 org.apache.hadoop.hbase.client.Result ```
private def getItemId(row: Result): Long = {
val key = Bytes.toString(row.getRow)
val TrxColumnFamily = Bytes.toBytes("trx")
val ItemIdColumn = Bytes.toBytes("itemId")

val itemId =
Bytes.toLong(row.getValue(TrxColumnFamily, ItemIdColumn))
itemId

}
这个 `getItemId` 以上函数正确返回 `itemId` . 那是因为 `Bytes.toLong` 是的一部分 `org.apache.hadoop.hbase.util.Bytes` 正确地将字节字符串转换为long。
我正在使用类似于这个的大查询用户界面,并使用 `CAST(itemId AS integer)` 因为bigquery没有 `Long` 数据类型。这不正确地投射了 `itemId` 字节字符串转换为整数,结果值为 `0` . 
有什么办法能让我有一个 `Bytes.toLong` 等效于 `hbase-client` 在bigquery中?如果没有的话,我还有别的办法解决这个问题吗?
2nc8po8w

2nc8po8w1#

试试这个:

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;

相关问题