以编程方式从CSV文件格式创建HBase表,并加载其内容



您好,我是hadoop的新手,我正在尝试使用MapReduce将csv表导入到Hbase。

我使用的是Cloudera 5.9

我想首先使用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),我使用了以下两种方法:

  1. csv -> HDFS我经常使用CSV格式的数据。事实证明,将CSV文件自动转换为Hive/Impala数据库表的过程非常棘手。以下是必要的步骤:

。读取CSV文件并进行必要的转换。分析csv文件中数据的列名是很重要的,但是,必须创建一个不包含标题行的文件副本。

b。然后我在集群的名称节点机器上创建一个文件夹(仍然不是HDFS)

mkdir -p input

c。并复制我的csv文件(没有标题行)到上面创建的文件夹使用JSch java库支持SFTP协议:

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';"

我以编程方式创建这个createttable .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语句。

    相关内容

    • 没有找到相关文章

    最新更新