Приведение к длинному типу данных - BigQuery
BigQuery и SQL нуб здесь. Я просматривал возможные типы данных, которые поддерживает большой запрос. У меня есть столбец в bigtable, который имеет тип bytes
и его исходный тип данных является Scala Long
, Это было преобразовано в bytes
и хранится в bigtable из моего кода приложения. Я пытаюсь сделать CAST(itemId AS integer)
(где itemId
имя столбца) в пользовательском интерфейсе BigQuery, но вывод CAST(itemId AS integer)
0 вместо фактического значения. Я понятия не имею, как это сделать. Если бы кто-то мог указать мне правильное направление, я был бы очень признателен.
РЕДАКТИРОВАТЬ: Добавление более подробной информации
Образец itemId
является 190007788462
Ниже приведен код, который пишет 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))
}
Ниже приведена запись в большой таблице на основе приведенного выше кода
Строка Колонна + клетка foo column=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
который правильно преобразует строку байтов в Long.
Я использую большой интерфейс запроса, похожий на этот, и использую CAST(itemId AS integer)
потому что BigQuery не имеет Long
тип данных. Это неправильно бросает itemId
строка байтов в целое число, и результирующее значение 0
,
Есть ли способ, которым я могу иметь Bytes.toLong
эквивалент из hbase-client
в интерфейсе BigQuery? Если нет, то есть ли другой способ решить эту проблему?
1 ответ
Попробуй это:
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;