복붙노트

[HADOOP] 오류 HDFS에 하이브 테이블에 CSV 파일의 데이터를 매핑하는 동안

HADOOP

오류 HDFS에 하이브 테이블에 CSV 파일의 데이터를 매핑하는 동안

나는 아래의 단계를 수행하여 하이브 테이블에 dataframe를로드하는 것을 시도하고있다 :

내가 만든 테이블에 dataframe를로드 한 후, 여기에 직면하고있는 문제는 테이블을 쿼리 할 때, 나는 쿼리에 잘못된 결과를 얻고있다. 예를 들면 : 나는 파일로 저장하기 전에 dataframe에 아래의 쿼리를 적용하는 경우 :

finalDF.createOrReplaceTempView("tmpTable")
select header_id,line_num,debit_rate,debit_rate_text,credit_rate,credit_rate_text,activity_amount,activity_amount_text,exchange_rate,exchange_rate_text,amount_cr,amount_cr_text from tmpTable where header_id=19924598 and line_num=2

나는 제대로 출력을 얻을. 모든 값은 제대로 열 정렬됩니다 :

[19924598,2,null,null,381761.40000000000000000000,381761.4,-381761.40000000000000000000,-381761.4,0.01489610000000000000,0.014896100000000,5686.76000000000000000000,5686.76]

그러나 CSV 파일에 dataframe을 저장 한 후, 그것을 (STEP4)의 상단에 테이블을 만들고 나는 데이터가 뒤죽박죽 부적절 열 매핑입니다 참조 생성 된 테이블에 동일한 쿼리를 적용 :

select header_id,line_num,debit_rate,debit_rate_text,credit_rate,credit_rate_text,activity_amount,activity_amount_text,exchange_rate,exchange_rate_text,amount_cr,amount_cr_text from schema.tablename where header_id=19924598 and line_num=2

+---------------+--------------+-------------+------------------+-------------+------------------+--------------------------+-------------------------------+------------------------+-----------------------------+--------------------+-------------------------+--+
| header_id     | line_num     | debit_rate  | debit_rate_text  | credit_rate  | credit_rate_text  | activity_amount  | activity_amount_text  | exchange_rate  | exchange_rate_text  | amount_cr  | amount_cr_text  |
+---------------+--------------+-------------+------------------+-------------+------------------+--------------------------+-------------------------------+------------------------+-----------------------------+--------------------+-------------------------+--+
| 19924598      | 2            | NULL        |                  | 381761.4    |                    | 5686.76          | 5686.76               | NULL           | -5686.76            | NULL       |                 |

그래서 dataframe에서 그것으로 내가 선행 하이브 테이블을 만들어 다른 접근 방식을 사용하여 데이터를 삽입 시도했다 :

작업이 완료되면 내가 전술 선택 쿼리를 실행하는 경우에도이 방법이 실패합니다. 나는 거기 메타 데이터에 문제가 있지만 아무것도 운동에 보인다 경우 만보고 새로 고침 테이블 스키 마와 msckrepair 테이블 스키 마을 사용하여 테이블을 새로했습니다.

그 누구도 날이 현상의 원인을 알려 수, 내가 여기에 데이터 운영 방식에 어떤 문제가 무엇입니까?

해결법

  1. ==============================

    1.코드는 스파크 2.3.2를 사용하여 테스트

    코드는 스파크 2.3.2를 사용하여 테스트

    CSV 파일에서 하이브 테이블을 대신 CSV 파일에서 스파크 dataframe을 만든 다음 쉽게 SQL 명령을 실행할 수 있습니다, 하이브 테이블로 등록 및 생성

    val conf = new SparkConf
        conf
          .set("hive.server2.thrift.port", "10000")
          .set("spark.sql.hive.thriftServer.singleSession", "true")
          .set("spark.sql.warehouse.dir", "hdfs://PATH_FOR_HIVE_METADATA")
          .set("spark.sql.catalogImplementation","hive")
          .setMaster("local[*]")
          .setAppName("ThriftServer")
    
    val spark = SparkSession.builder()
          .config(conf)
          .enableHiveSupport()
          .getOrCreate()
    

    이제 하이브 사용자로 SQL 명령을 실행할 수 있습니다 스파크 객체를 사용하여 :

    spark.sql("DROP DATABASE IF EXISTS my_db CASCADE")
    spark.sql("create database if not exists my_db")
    spark.sql("use my_db")
    

    당신은 HDFS 디렉토리의 모든 csv_files를로드 할 수 있습니다 (또는 정확히 하나 개의 CSV 파일의 경로를 제공 할 수 있습니다) 다음 코드를 사용 :

    spark.sql(
          "CREATE TABLE test_table(" +
            "id int," +
            "time_stamp bigint," +
            "user_name string) " +
            "ROW FORMAT DELIMITED " +
            "FIELDS TERMINATED BY ',' " +
            "STORED AS TEXTFILE " +
            "LOCATION 'hdfs://PATH_TO_CSV_Directory_OR_CSV_FILE' "
        )
    

    그리고 마지막에 등록 스파크는 하이브 ThriftServer으로 개체는 SqlContext :

    HiveThriftServer2.startWithContext(spark.sqlContext)
    

    이 포트 10000에 ThriftServer 엔드 포인트를 작성합니다.

    INFO ThriftCLIService: Starting ThriftBinaryCLIService on port 10000 with 5...500 worker threads
    

    지금 당신은 직선을 실행하고 ThriftServer에 연결할 수 있습니다 :

    beeline> !connect jdbc:hive2://localhost:10000
    Connecting to jdbc:hive2://localhost:10000
    Enter username for jdbc:hive2://localhost:10000: enter optional_username
    Enter password for jdbc:hive2://localhost:10000: leave blank
    Connected to: Spark SQL (version 2.3.2)
    Driver: Hive JDBC (version 1.2.1.spark2)
    Transaction isolation: TRANSACTION_REPEATABLE_READ
    0: jdbc:hive2://localhost:10000>
    

    그리고 테스트 테이블 test_table은 my_db 데이터베이스에서 생성 된 경우 :

    0: jdbc:hive2://localhost:10000> use my_db;
    0: jdbc:hive2://localhost:10000> show tables ;
    +-----------+-----------------------+--------------+--+
    | database  |       tableName       | isTemporary  |
    +-----------+-----------------------+--------------+--+
    | my_db     | test_table            | false        |
    +-----------+-----------------------+--------------+--+
    

    또한, ThrifServer JDBC 끝점을 사용하는 다른 하이브 테이블 (또는 HiveQL 명령)을 만들 수 있습니다.

    여기에 필요한 의존성은 다음과 같습니다 :

     libraryDependencies ++= Seq(
      "org.apache.spark" %% "spark-core" % sparkVersion,
      "org.apache.spark" %% "spark-sql" % sparkVersion,
      "org.apache.spark" %% "spark-hive" % sparkVersion,
      "org.apache.spark" %% "spark-hive-thriftserver" % sparkVersion,
      "org.apache.hadoop" % "hadoop-hdfs" % "2.8.3",
      "org.apache.hadoop" % "hadoop-common" % "2.8.3",
    )
    
  2. ==============================

    2.나는 rowformat의 serde을 사용 : org.apache.hadoop.hive.serde2.OpenCSVSerde 하이브 DDL에. 이것은 또한 기본 분리 문자로 ','가지고 있는데 다른 구분 기호를 부여하지 않았다.

    나는 rowformat의 serde을 사용 : org.apache.hadoop.hive.serde2.OpenCSVSerde 하이브 DDL에. 이것은 또한 기본 분리 문자로 ','가지고 있는데 다른 구분 기호를 부여하지 않았다.

  3. from https://stackoverflow.com/questions/54691697/error-while-mapping-the-data-from-csv-file-to-a-hive-table-on-hdfs by cc-by-sa and MIT license