转换为长数据类型 - BigQuery
Cast to long datatype - BigQuery
BigQuery 和 SQL 菜鸟在这里。我正在研究大查询支持的可能数据类型 here。我在 bigtable 中有一个类型为 bytes
的列,它的原始数据类型是 scala Long
。这已从我的应用程序代码转换为 bytes
并存储在 bigtable 中。我正在尝试在 BigQuery UI 中执行 CAST(itemId AS integer)
(其中 itemId
是列名),但 CAST(itemId AS integer)
的输出是 0 而不是实际值。我不知道该怎么做。如果有人能指出正确的方向,我将不胜感激。
编辑: 添加更多详细信息
样本 itemId
是 190007788462
以下是将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))
}
以下是大table中基于上述代码
的入口
行列+单元格
foo column=trx:itemId, value=\x00\x00\x00\xAFP]F\xAA
以下是在scala中从big table读取条目的相关代码。这工作正常。 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
函数正确returnsitemId
。那是因为 Bytes.toLong
是 org.apache.hadoop.hbase.util.Bytes
的一部分,它正确地将 Byte 字符串转换为 Long。
我正在使用类似于 this one 的大查询 UI 并使用 CAST(itemId AS integer)
因为 BigQuery 没有 Long
数据类型。这错误地将 itemId
字节字符串转换为整数,结果值为 0
。
有什么方法可以让我在 BigQuery UI 中得到 hbase-client
的 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;
BigQuery 和 SQL 菜鸟在这里。我正在研究大查询支持的可能数据类型 here。我在 bigtable 中有一个类型为 bytes
的列,它的原始数据类型是 scala Long
。这已从我的应用程序代码转换为 bytes
并存储在 bigtable 中。我正在尝试在 BigQuery UI 中执行 CAST(itemId AS integer)
(其中 itemId
是列名),但 CAST(itemId AS integer)
的输出是 0 而不是实际值。我不知道该怎么做。如果有人能指出正确的方向,我将不胜感激。
编辑: 添加更多详细信息
样本 itemId
是 190007788462
以下是将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))
}
以下是大table中基于上述代码
的入口行列+单元格 foo column=trx:itemId, value=\x00\x00\x00\xAFP]F\xAA
以下是在scala中从big table读取条目的相关代码。这工作正常。 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
函数正确returnsitemId
。那是因为 Bytes.toLong
是 org.apache.hadoop.hbase.util.Bytes
的一部分,它正确地将 Byte 字符串转换为 Long。
我正在使用类似于 this one 的大查询 UI 并使用 CAST(itemId AS integer)
因为 BigQuery 没有 Long
数据类型。这错误地将 itemId
字节字符串转换为整数,结果值为 0
。
有什么方法可以让我在 BigQuery UI 中得到 hbase-client
的 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;