преобразовать все целочисленные столбцы в float

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

У меня около 30 целых столбцов, и я хотел бы преобразовать все существующие целочисленные столбцы в тип данных с плавающей запятой.

На данный момент мне удалось преобразовать только один столбец за раз.

Я пробовал этот код, но не смог добиться успеха.

 select CAST(sales,duration AS float) FROM tableName
  

Возможно ли это сделать в BigQuery?

Комментарии:

1. По одному приведению на столбец! Но почему вы храните данные в целочисленных столбцах, если хотите отображать float?

2. я загрузил данные, используя --autodetect командную строку in bq. Он загрузил некоторые столбцы как целые числа. Итак, я хочу преобразовать их все в float

Ответ №1:

Возможно ли это сделать в bigquery?

Да, вы можете использовать команду DML для изменения структуры вашей таблицы, например:

 #standardSQL
 CREATE OR REPLACE TABLE mydataset.newtable (
         field0 FLOAT64, 
         field1 FLOAT64, 
         field2 FLOAT64)
 OPTIONS(
   description="a table with new FLOAT fields",
   labels=[("org_unit", "development")]
 )
  

После того, как вы сделали это, вы можете выбирать из таблицы, не используя cast

Если у вас много столбцов и сложно составить список, у вас есть два варианта, чтобы ускорить это:

вариант 1:
используйте bq show command для получения всех столбцов (вы можете использовать оболочку BigQuery, если у вас нет bq локальной установки)

 bq show --format=prettyjson --schema datasetId.tableId
  

Это выведет все ваши столбцы в этом формате:

 {
    "mode": "NULLABLE",
    "name": "ProvisionedThroughput",
    "type": "STRING"
  }
  

Вы можете использовать этот вывод и использовать любой редактор, который вам нравится, чтобы создать правильный синтаксис для CREATE OR REPLACE

Вариант 2:

Если вы подписаны на бета-версию BigQuery INFORMATION_SCHEMA, вы можете просто выбрать из INFORMATION_SCHEMA все свои поля следующим образом:

 WITH ColumnNames AS
  (SELECT COLUMN_NAME,
          data_type
   FROM datasetId.INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_NAME = "tables" )
SELECT CONCAT(ARRAY_TO_STRING(ARRAY (SELECT CONCAT(COLUMN_NAME, ' ', 'FLOAT64') FROM ColumnNames), ' n'), ')');
  

Который возвращает следующий массив, готовый к использованию:

введите описание изображения здесь

Комментарии:

1. Спасибо, но у меня есть 200 целых столбцов, которые нужно преобразовать в float, и трудно указать все столбцы выше query…is есть какой-нибудь обходной путь?

2. @NikhilBOORLA Я редактирую свой ответ, чтобы помочь вам преодолеть проблему с 200 столбцами… Я вижу, что они быстро растут по сравнению с вашими исходными 30 🙂

3. @NikhilBOORLA Если мой ответ был полезен, пожалуйста, подумайте о том, чтобы принять его, вот как: meta.stackexchange.com/questions/5234 /…