2016-02-20 58 views
0

我有一個postgress表,其中有文本列(詳細信息)。我已將詳細信息聲明爲Hive中的STRING。它正在成功導入當我嘗試從SQOOP或SPark中導入它時。但是我缺少大量可用於詳細列的數據,並且很多空行正在hive表中創建。如何將Postgress「文本」數據類型加載到HIVE中

任何人都可以幫助我嗎?

例:細節列具有以下數據

LINE1 sdhfdsf dsfdsdfdsf的DSF
LINE2 jbdfv DF ffdkjbfd
jbdsjbfds dsfsdfb dsfds
DFDS dsfdsfds dsfdsdskjnfds
sdjfbdsfdsdsfds

只有「line1 sdhfdsf dsfdsdfdsf dsfs「正被導入到配置單元表中。

我可以看到剩餘行的空行。

+1

你能否提供更多細節?你如何將它導入到Hive中 - 你的代碼是什麼樣的? – femibyte

+0

如果您的TEXT數據包含**嵌入的行尾字符**(LF,或CR或CR-LF),那麼您有麻煩了。因爲他們將被SerDe的大多數人處理爲**記錄分隔符**(錯誤)。因此,即使您的目標Hive表處理「多行記錄」,在Map和Reduce之間使用SequenceFile格式的每個MapReduce作業都將被擰緊。 –

+0

如果確實存在嵌入行尾字符的問題,我強烈建議您將它們*在源數據庫*中轉換爲對Hadoop無害的內容,但可以轉換回。例如「
」(HTML風格)或者「 」(XML風格)或者「¶」(文本編輯器風格)。 –

回答

1

Hive不支持文本文件格式的多行。您必須將此數據加載到二進制文件Avro或Parquet中,以保留換行符。如果你沒有需要保留它們,那麼你可以用蜂房落進口delims

+0

感謝Nick,現在我可以使用Parquet將數據存儲到HIVE中。 –

0

這裏剝奪他們的解決方案

SparkConf sparkConf = new SparkConf().setAppName("HiveSparkSQL"); 
    SparkContext sc = new SparkContext(sparkConf); 

    HiveContext sqlContext= new HiveContext(sc); 
    sqlContext.setConf("spark.sql.parquet.binaryAsString","true"); 

    String url="jdbc:postgresql://host:5432/dbname?user=**&password=***"; 

    Map<String, String> options = new HashMap<String, String>(); 
    options.put("url", url); 
    options.put("dbtable", "(select * from abc.table limit 50) as act1"); 
    options.put("driver", "org.postgresql.Driver"); 

    DataFrame jdbcDF = sqlContext.read().format("jdbc").options(options).load(); 
    jdbcDF.write().format("parquet").mode(SaveMode.Append).saveAsTable("act_parquet"); 
相關問題