Impala — заменить NULL на ноль для всей таблицы

#null #impala

#null #impala

Вопрос:

Привет, эксперты —

Есть ли способ заменить null на ноль для всей таблицы в impala? Пока я нашел только coalesce или case — when, который позволяет мне изменять столбец за столбцом .. но у меня в таблице более 210 столбцов, поэтому я ищу что-то более эффективное, если это возможно..

ВЫБЕРИТЕ COALESCE(table1.column1,0) Из table1

Заранее спасибо!

Ответ №1:

Это не отвечает на общий вопрос, нужно ли заменять NAS в 200 столбцах, не набирая COALESCE(table1.column1,0) более 200 раз.

Но я вижу из вашего профиля, что вы, вероятно, используете R. Я тоже, и у меня та же проблема: мне нужно заменить NAS в моей таблице на 200 столбцов.

Мое решение — использовать implyr с R.

 # libraries
library(pacman)
p_load(implyr
       ,odbc
       ,tidyverse
)

# connect to database
con <- src_impala(drv = odbc::odbc(),
                  HOST="host.xxx.x",
                  PORT=12345,
                  ...)

# connect to table
table1 <- tbl(con,table1)

# get columns with I want to replace NAs in, in my case it's numeric tables
numeric_columns_to_replace_NAs <- table1 %>% 
                                  select_if(is.numeric) %>% 
                                  colnames

# the command which replaces all NAs with 0's
query <- table1 %>% 
         mutate_at(.vars = vars(numeric_columns_to_replace_NAs),
                   .funs = funs(coalesce(.,0))) 

# run command - this will print to the console
query 
  

вы также можете compute() или collect() свои результаты в зависимости от того, что вам нужно (см. документы)

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

 # some object with the class "tbl_impala"
query_object <- query %>% 
              collapse() %>% 
              .[2]

# actual query which can be passed to hive via R. 
sql_query <- query_object[[1]]$x %>% 
           as.character()

# create new table
new_query <- paste0("CREATE TABLE table2 AS ",sql_query) %>% 
           str_replace_all(pattern = "'",replacement = '"') # this cleans up the code so it works

# if you want text without characters like n in there.
cat(sql_query)