1

BigQuery 和 SQL 新手在这里。我在这里浏览了大查询支持的可能数据类型。我在 bigtable 中有一个类型的列,bytes它的原始数据类型是 scala Long。这bytes已从我的应用程序代码转换为并存储在 bigtable 中。我正在尝试在 BigQuery UI 中执行CAST(itemId AS integer)itemId列名在哪里),但输出CAST(itemId AS integer)为 0 而不是实际值。我不知道该怎么做。如果有人能指出我正确的方向,那么我将不胜感激。

编辑:添加更多细节
示例itemId190007788462

以下是写入itemId大表的代码。我已经包含了相关的方法。用于hbase client写入大表。

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

}

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

行列+单元格

foo 列=trx:itemId,值=\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正确地将字节字符串转换为长。

我正在使用与此类似的大查询 UI并使用CAST(itemId AS integer),因为 BigQuery 没有Long数据类型。这错误地将itemId字节字符串转换为整数,结果值为0.

有什么方法可以让我在 BigQuery UI 中获得Bytes.toLong等价物?hbase-client如果没有,我还有其他方法可以解决这个问题吗?

4

1 回答 1

2

尝试这个:

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;
于 2017-11-09T07:00:31.000 回答