Приведение к длинному типу данных - 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;
Другие вопросы по тегам