【问题标题】:Create HBase table from CSV file format programmatically and load its content以编程方式从 CSV 文件格式创建 HBase 表并加载其内容
【发布时间】:2016-11-15 21:27:59
【问题描述】:

您好,我对 hadoop 很陌生,我正在尝试使用 MapReduce 将 csv 表导入 Hbase。

我正在使用 Cloudera 5.9

我想首先使用 MapReduce 从 CSV 表格式以编程方式创建 HBase 表(因为我使用由大量列组成的 csv 文件)然后将 CSV 文件的内容加载到 HBase 表中

请任何人指导我或告诉我如何解决这个问题

【问题讨论】:

    标签: csv hadoop mapreduce cloudera bigdata


    【解决方案1】:

    可以通过编程方式创建 HBase 表。有关使用 Java API 的参考,请参阅 https://www.tutorialspoint.com/hbase/hbase_create_table.htm

    此外,在 HBase 中创建表时,您不必创建所有列,只需创建列族(将列族视为一组列并存储在一起。HBase 是列式的)。作为加载内容 (PUT) 的一部分,可以创建/使用列并插入/更新数据。对于 Java API,请参阅 http://hbase.apache.org/apidocs/

    【讨论】:

      【解决方案2】:

      为了将数据上传到集群的数据库(HBase),我使用了以下两种方法:

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

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

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

      mkdir -p input

      c。并将我的 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(我首先删除了一个可能存在的同名文件):

      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) 很重要的原因。

      1. 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 语句。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        • 1970-01-01
        • 2017-02-21
        相关资源
        最近更新 更多