嗨,我对hadoop很陌生,我正在尝试使用mapreduce将csv表导入hbase。我正在使用cloudera 5.9首先,我想使用mapreduce从csv表格式以编程方式创建一个hbase表(因为我使用的是由大量列组成的csv文件),然后将csv文件的内容加载到hbase表请任何一个指导我或告诉我如何解决这个问题
7gyucuyw1#
hbase表可以按语法创建。有关使用javaapi的参考,请参见https://www.tutorialspoint.com/hbase/hbase_create_table.htm另外,在hbase中创建表时,不必创建所有列,只需创建列族(将列族视为一组列并存储在一起)。hbase是柱状的)。作为加载内容(put)的一部分,可以创建/使用列并插入/更新数据。有关java api,请参阅http://hbase.apache.org/apidocs/
kcugc4gi2#
为了将数据上传到集群的数据库(hbase),我使用了以下两种方法:csv->hdfs我经常有csv格式的数据。将csv文件自动转换为hive/impala数据库表的过程非常棘手。以下是必要的步骤:答。读取csv文件并进行必要的转换。分析csv文件中数据的列名很重要,但是,必须创建不包含标题行的文件副本。b。然后在集群的名称节点机器上创建一个文件夹(仍然不是hdfs) mkdir -p input c。并使用支持sftp协议的jsch java库将我的csv文件(不带标题行)复制到上面创建的文件夹中:
mkdir -p input
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中(我首先删除可能存在的同名文件):
hdfs dfs -rm input/file.csv hdfs dfs -mkdir -p input hdfs dfs -put input/file.csv input
e。一旦文件在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
为了执行这个脚本,impala用户必须对csv文件拥有必要的权限。这就是为什么步骤e)很重要。jdbc->hdfs如果直接从数据库中读取数据,那么将数据复制到hdfs表中要容易得多。因此可以使用sqoop工具。在第一步中,创建Parquet文件:
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
之后,可以从Parquet文件创建表:
# !/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语句。
2条答案
按热度按时间7gyucuyw1#
hbase表可以按语法创建。有关使用javaapi的参考,请参见https://www.tutorialspoint.com/hbase/hbase_create_table.htm
另外,在hbase中创建表时,不必创建所有列,只需创建列族(将列族视为一组列并存储在一起)。hbase是柱状的)。作为加载内容(put)的一部分,可以创建/使用列并插入/更新数据。有关java api,请参阅http://hbase.apache.org/apidocs/
kcugc4gi2#
为了将数据上传到集群的数据库(hbase),我使用了以下两种方法:
csv->hdfs我经常有csv格式的数据。将csv文件自动转换为hive/impala数据库表的过程非常棘手。以下是必要的步骤:
答。读取csv文件并进行必要的转换。分析csv文件中数据的列名很重要,但是,必须创建不包含标题行的文件副本。
b。然后在集群的名称节点机器上创建一个文件夹(仍然不是hdfs)
mkdir -p input
c。并使用支持sftp协议的jsch java库将我的csv文件(不带标题行)复制到上面创建的文件夹中:以下是jsch的依赖关系:
d。当csv文件位于linux主机上时,可以通过以下命令轻松地将其放入hdfs中(我首先删除可能存在的同名文件):
e。一旦文件在hdfs中,我就将权限更改为777(在项目符号g下解释)
f。现在,可以使用以下bash脚本创建表了:
我以编程方式创建这个createtable.sh脚本。脚本的列名取自步骤a)。记住上传的数据没有列名。对于每一列,了解它的类型是很重要的,这就是为什么我编写了一些代码来分析csv文件的前n行,并猜测列中是否有整数、双精度、日期或字符串值。然后将脚本复制到事先创建的脚本文件夹中:
执行脚本:
为了执行这个脚本,impala用户必须对csv文件拥有必要的权限。这就是为什么步骤e)很重要。
jdbc->hdfs如果直接从数据库中读取数据,那么将数据复制到hdfs表中要容易得多。因此可以使用sqoop工具。
在第一步中,创建Parquet文件:
之后,可以从Parquet文件创建表:
缺点是,通常不能像处理csv文件那样处理/转换中间的数据,而是从数据库中按原样获取数据。可以向sqoop语句中添加where子句,但不能使用特定的select语句。