您好我對hadoop相當陌生,我試圖使用MapReduce將csv表導入Hbase。以編程方式從CSV文件格式創建HBase表並加載其內容
我使用Cloudera的5.9
我想firsly從使用MapReduce的一個CSV表格格式編程的方式創建一個HBase的表(因爲我用非常大的數字列組成的CSV文件),然後加載的內容CSV文件到HBase的表
請任何一個可以指導我或告訴我怎麼解決這個問題
您好我對hadoop相當陌生,我試圖使用MapReduce將csv表導入Hbase。以編程方式從CSV文件格式創建HBase表並加載其內容
我使用Cloudera的5.9
我想firsly從使用MapReduce的一個CSV表格格式編程的方式創建一個HBase的表(因爲我用非常大的數字列組成的CSV文件),然後加載的內容CSV文件到HBase的表
請任何一個可以指導我或告訴我怎麼解決這個問題
HBase的表可以創建親語法。有關使用Java API的參考,請參見https://www.tutorialspoint.com/hbase/hbase_create_table.htm
同時,在HBase中創建表時,您不必創建只需創建列族的所有列(將列族視爲一組列並將它們存儲在一起。HBase是柱狀的)。作爲加載內容的一部分(PUT),可以創建/使用列和插入/更新數據。對於Java API參考 http://hbase.apache.org/apidocs/
我已經使用,以便將數據上傳到集羣數據庫(HBase的),以下兩種方法:
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)很重要。
在第一步驟中一個拼花文件被創建:
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語句。