2016-11-15 45 views
0

您好我對hadoop相當陌生,我試圖使用MapReduce將csv表導入Hbase。以編程方式從CSV文件格式創建HBase表並加載其內容

我使用Cloudera的5.9

我想firsly從使用MapReduce的一個CSV表格格式編程的方式創建一個HBase的表(因爲我用非常大的數字列組成的CSV文件),然後加載的內容CSV文件到HBase的表

請任何一個可以指導我或告訴我怎麼解決這個問題

回答

0

我已經使用,以便將數據上傳到集羣數據庫(HBase的),以下兩種方法:

  1. CSV - > HDFS 我經常在CSV格式的數據。自動將CSV文件轉換爲Hive/Impala數據庫表的過程變得非常棘手。以下是必要的步驟:

a。閱讀csv文件並進行必要的轉換。分析csv文件中數據的列名是很重要的,但是必須創建一個不包含標題行的文件的副本。

b。然後,我創建羣集的名稱節點機上的文件夾(還沒有HDFS)

mkdir -p input

℃。和複製我csv文件(無頭行)插入上述使用支持SFTP協議JSch Java庫創建的文件夾:

public static void copyFileToLinux(String dest, String user, String password, String file) throws JSchException, SftpException,  FileNotFoundException { 
String destination = "/home/"+user+"/"+dest; 
jsch = new JSch(); 
session = jsch.getSession(user,"host",22); 
session.setPassword(password); 
session.setConfig("StrictHostKeyChecking", "no"); 
session.connect(); 
ChannelSftp channel = null; 
channel = (ChannelSftp)session.openChannel("sftp"); 
channel.connect(); 
File localFile = new File(file); 
channel.cd(destination); 
channel.put(new FileInputStream(localFile),localFile.getName()); 
channel.disconnect(); 
session.disconnect(); 
} 

這裏是JSCH依賴性:

<dependency> 
<groupId>com.jcraft</groupId> 
<artifactId>jsch</artifactId> 
<version>0.1.53</version> 
</dependency> 

d。當csv文件是Linux主機它可以容易地通過下面的命令投入HDFS上(I首先移除具有相同名稱的潛在存在的文件):

hdfs dfs -rm input/file.csv 
hdfs dfs -mkdir -p input 
hdfs dfs -put input/file.csv input 

即只要該文件在HDFS中,我將權限更改爲777(在項目符號g下的解釋)

hdfs dfs -chmod -R 777 /user/vKey/input 

f。現在一切都準備好表的創建,可以與以下的bash腳本來完成:

#!/bin/bash 
path=$1 
table_name=$2 
impala-shell -i host -q "DROP TABLE IF EXISTS $2;" 
impala-shell -i host -q "CREATE EXTERNAL TABLE $2 (c1 INTEGER,c2 STRING,c3 INTEGER,c4 INTEGER,c5 STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/user/vKey/input';" 

我編程方式創建這個CreateTable.sh腳本。腳本的列名取自步驟a)。請記住,上傳的數據沒有列名。對於每一列,知道它的類型很重要,這就是爲什麼我寫了一些代碼來分析csv文件的前n行,並猜測列中是否有整數,雙精度,日期或字符串值。 該腳本然後複製到其被預先創建的腳本文件夾:

mkdir -p scripts 

被執行的腳本:

sh scripts/CreateTable.sh input/file.csv schema.table 

爲了執行該腳本的帕拉用戶必須具有的必要的權利csv文件。這就是爲什麼步驟e)很重要。

  1. JDBC - > HDFS 如果直接從數據庫中讀取數據,將數據複製到HDFS表中會容易得多。因此可以使用工具sqoop。

在第一步驟中一個拼花文件被創建:

sqoop import --connect jdbc:oracle:thin:@//host:1521/service --username user -P --table schema.table --target-dir hdfs:////data/schema/table -m 1 --as-parquetfile 

此後該表可以從鑲木文件被創建:

#!/bin/bash 

parquet_path=$1 
table_name=$2 
schema=$3 

hadoop fs -setfacl -R -m group:hive:rwx $parquet_path 

par_file_list=`hadoop fs -ls $parquet_path | tail -n 1` 
par_file=${par_file_list##* } 
impala-shell -i host -q "DROP TABLE IF EXISTS $schema.$table_name;" 

prefix="hdfs://" 
parquet_without_hdfs=${parquet_path#$prefix} 

impala-shell -i host -q "CREATE EXTERNAL TABLE $schema.$table_name LIKE PARQUET '$par_file' 
STORED AS PARQUET 
LOCATION '$parquet_path';" 

,你通常不能操縱的缺點/像使用csv文件一樣對數據進行轉換,但是您更願意從數據庫中直接獲取數據。可以在sqoop語句中添加where子句,但不可能使用特定的select語句。

相關問題