作爲困擾我一週的一個問題,經過各種嘗試,最終確定爲讀取文件並寫入的方式頗爲高效,在此記錄。
# -*- coding: utf-8 -*-
import os
from pyspark import SparkContext, HiveContext, Row, StorageLevel
from pyspark.mllib.stat import Statistics
import tempRain
#加這一部分是爲了解決轉碼問題,就不需要手動encode、decode
reload(sys)
sys.setdefaultencoding('utf-8')
output_tmp_dir="hdfs://hdfs地址"
def loadinto(exampleList,flag):
line1 = sc.parallelize(exampleList)
line1.repartition(1).textsaveAsTextFile(output_tmp_dir+flag)
sqlContext.sql("load data inpath '"+output_tmp_dir+flag+"' into table "+currentSchema+".table1")
#調用example:
dayList=[]
insert="案例1\001案例2\001"
dayList.append(insert)
flag="123"
loadinto(dayList,flag)
思路是先通過RDD的textsaveAsTextFile保存爲hdfs文件,再通過hive的load語句加載進入目標table。
目標表建表語句,要保證是表存儲格式是textfile格式
create table table1
(
a string,
b string
)
row format delimited
fields terminated by '\001'
stored as textfile
\001是數據間隔符
目前只找到此種文件導入方式,textfile格式表也存在缺點,即文件不壓縮,佔用空間較大,應該還存在更理想實現方案,
有待驗證