2017-12-12 2 views
0

SQL 서버에서 SQOOP 증분 업데이트를 사용하여 HBase 테이블로 테이블을로드 중입니다. 그러나 SQL 테이블의 null 값은 HBase로 가져올 수 없습니다. 나는 Hbase가 null 값을 지원하지 않으며 null을 포함하는 필드가 Hbase에 존재하지 않는다는 것을 이해합니다. 하지만 내 관심사는 특정 레코드가 필드에 값이있는 경우에도 대부분의 레코드에 대해 특정 열에 null 값이있는 경우입니다. 는 SQL 테이블 구조 위의 표에서SQOOP - 가져 오기 실패 : Null 문자열에서 경로를 만들 수 없습니다.

CREATE TABLE [dbo].[user_test](
[user_id] [nvarchar](20) NOT NULL, 
[user_name] [nvarchar](100) NULL, 
[password] [varchar](128) NULL, 
[created_date] [datetime2](7) NULL, 
[modified_date] [datetime2](7) NULL, 
[last_login_date] [datetime2](7) NULL, 
[email_id] [nvarchar](100) NULL, 
[security_question_id] [int] NULL, 
[answered_count] [int] NULL, 
[skip_count] [int] NULL, 
[role_id] [smallint] NULL, 
[use_yn] [char](1) NULL, 
[first_login] [char](1) NULL, 
[score] [int] NULL, 
[secret_answer] [nvarchar](100) NULL, 
PRIMARY KEY CLUSTERED 
(
[user_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

되어 다음, EMAIL_ID의 값은 대부분의 레코드에 null입니다. 그러나 email_id 값이있는 레코드의 경우에도 Hbase 테이블로 가져 오지 않습니다. sqoop 명령은 SQL에 추가 된 레코드를 가져 오는 데 성공했습니다. SQOOP 명령은 다음과 같습니다.

sqoop import 
    --connect "jdbc:sqlserver://107.108.32.198:1433;database=ETL_interim_DB;" 

    --username "hadoop" --password "Semco123" 
    --query "SELECT CAST(user_id AS Integer) as 
    user_id,user_name,password,modified_date,last_login_date,email_id,security_question_id,answered_count,skip_count,role_id,use_yn,first_login,score,secret_answer from 

    ETL_interim_DB.dbo.user_test WHERE \$CONDITIONS" 
    --hbase-table test2 
    --column-family cf 
    --hbase-row-key user_id 
    --split-by user_id -m 1 
    --incremental append 
    --check-column user_id 
    --last-value 10 

다음 오류가 표시되었습니다.

Note: Recompile with -Xlint:deprecation for details. 
0 [main] ERROR org.apache.sqoop.tool.ImportTool - Imported Failed: Can 
not create a Path from a null string 

사람이 HBase를 테이블로 가져 오는 동안 excatly 발생하는 SQL에서 HBase를로와 널 (null) 값의 경우 SQL 서버에 존재하는 모든 값을 가져 오는 방법을 제안시겠습니까?

+0

sqoop 가져 오기에서 가져 오기 제어 옵션 --null-string 및 --null-non-string을 사용하여 시도 했습니까? – Subash

+0

@SubashKonar : 예 --null-string 'nvl'\ --null-non-string '0'과 같은 가져 오기 제어 옵션을 사용해 보았습니다. \ 아무 것도 효과가 없었습니다. Null-string과 Null-non-string의 잘못된 사용법을 제안 해주십시오. – Annapurna

+0

@SubashKonar : SQL에서 HBase로 테이블을 가져 오는 동안 이러한 가져 오기 제어 옵션 (null-string 및 null-non-string) 응용 프로그램이 있습니까? 문서를 살펴볼 때 Hive에 테이블을 가져 오기위한 옵션 만 제공했습니다. – Annapurna

답변

1

COALESCE 연산은 기본값을 제공하여 SQL에서 null 필드를 HBase로 가져 오는 작업에 도움이되었습니다. 다음은 동일한 sqoop 명령입니다.

sqoop import 
    --connect "jdbc:sqlserver://107.108.32.198:1433;database=ETL_interim_DB;" 
    --username "hadoop" --password "Semco123" 
    --query "SELECT CAST(user_id AS Integer) as user_id 
    COALESCE(user_name,'xyz') as user_name, \ 
    COALESCE(password,'123') as password, \ 
    COALESCE(created_date, '9999-12-31 00:00:00.0000000') as created_date, \ 
    COALESCE(modified_date,'9999-12-31 00:00:00.0000000') as modified_date, \ 
    COALESCE(last_login_date,'9999-12-31 00:00:00.0000000') as lastlogin, \ 
    COALESCE(email_id,'0') as email_id, \ 
    COALESCE(security_question_id,-1) as security_question_id, \ 
    COALESCE(answered_count,-1) as answered_count, \ 
    COALESCE(skip_count,-1) as skip_count, \ 
    COALESCE(secret_answer, '0') as secret_answer, \ 
    COALESCE(role_id,0) as role_id, \ 
    COALESCE(use_yn,'0') as use_yn, \ 
    COALESCE(first_login,'0') as firstlogin, \ 
    COALESCE(score,-1) as score from ETL_interim_DB.dbo.ms_user_detail_test WHERE \$CONDITIONS" \ 
    --hbase-table test2 
    --column-family cf 
    --hbase-row-key user_id 
    --split-by user_id -m 1 
    --incremental append 
    --check-column user_id 
    --last-value 10 
0

이 작업을 시도해 볼 수 있습니다. Hbase에 null 값을 갖는 열이 있으면 SQL DB에서 NULL 값 (빈 셀)을 업데이트하여 '0'또는 'NULL'과 같은 값을 가질 수 있습니다. 아래는 쿼리입니다.

UPDATE [Table Name] SET [Column Name]='Null' WHERE [Column Name] IS NULL. 

또는,

ALTER TABLE [Table Name] CHANGE COLUMN [Column Name] VARCHAR(50) NOT NULL DEFAULT ''; 

그런 다음이 도움이 Hbase.Hope하기 위해 SQL 가져 오기를 시도!

+0

DIn이 당신을 위해 일해 줬습니다. @Annapurna? – Subash

관련 문제