转换为long数据类型 - BigQuery

时间:2017-11-09 02:23:57

标签: sql scala hbase google-bigquery hbase-client

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

编辑:添加更多详情 示例itemId190007788462

以下是将itemId写入大表的代码。我已经包括了相关的方法。使用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中的大表读取条目的相关代码。这工作正常。 Resultorg.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.toLongorg.apache.hadoop.hbase.util.Bytes的一部分,它正确地将字节字符串转换为Long。

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

有没有办法在BigQuery UI中从Bytes.toLong获得hbase-client等效内容?如果没有,我可以解决这个问题吗?

1 个答案:

答案 0 :(得分: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;