Örnek
Bir milyon json'u ayrıştırmak ve bunları alana göre tabloya eklemek için UDF'yi kullanın1. UDF yazın
public class MovieJsonParser UDF'yi genişletir {public String eval (String json), IOException {ObjectMapper objectMapper = new ObjectMapper (); MovieBean movieBean = objectMapper.readValue (json, MovieBean.class); return movieBean.toString ();}}Film fasulyesi nerede
public class MovieBean {private String movie; private String rate; private String timeStamp; private String uid; @Override public String toString () {return movie + "," + rate + "," + timeStamp + "," + uid;}}2. Bir kavanoz paketine yazın ve onu kovanın sınıf yoluna ekleyin
addJAR / home / hadoop / moviejsonparser.jar3. Bir işlev oluşturun
geçici işlev jsonparser as'com.kris.bigdata.hive.udf.MovieJsonParser 'oluşturun;4. Bir json tablosu oluşturun ve verileri yükleyin
tablo t_movie_json (json dizesi) oluştur; veriyi yerel yolla yükle '/ home / hadoop / rating.json' tablonun üzerine yaz t_movie_json;Tablodaki verilere bakın
5. Ayrıştırdıktan sonra eklenen bir tablo oluşturun
t_movie_rating tablosu (film dizesi, oran dizesi, unixtime dizesi, uid dizesi) ',' ile sonlandırılan satır biçimi sınırlandırılmış alanlar oluşturun;6. Ayrıştırın ve yeni tabloya ekleyin
Daha önce json ayrıştırmak için oluşturduğumuz UDF işlevini kullanın, bir sabit biçim dizesi çıktılayın ve karşılık gelen değeri elde etmek için dizeyi kesin
t_movie_ratingselect split (moviejsonparser (json), ','), split (moviejsonparser (json), ','), split (moviejsonparser (json), ','), split (moviejsonparser (json), ',') t_movie_json'dan;Ekledikten sonra verilerin nasıl göründüğüne bakın
Kovanda yerleşik bir json ayrıştırma işlevi vardır, ancak yalnızca tek katmanlı json nesnelerini ayrıştırabilir.Daha karmaşık json için, ayrıştırma için UDF yazmanız gerekir.
film olarak get_json_object (json, '$. movie'), t_movie_json limit 10'dan oran olarak get_json_object (json, '$. oran') seçin;1. Önce bir python betiği yazın
vi weekday_mapper.py #! / bin / pythonimport sysimport datetime # sys.stdin'deki satır için her girdi satırını geçin: # Baştaki ve sondaki boşlukları kaldırın line = line.strip (); # Her satırı kesin ve her bir değeri alın movieid, rating , unixtime, userid = line.split ('\ t') # Unix zamanını hafta gününe çevir. Spesifik süreç, önce unixtime'ı float'a dönüştürmek, ardından float'ı datetime'a dönüştürmek ve ardından hafta içi hafta içi = datetime.datetime.fromtimestamp (float (unixtime)) elde etmek için datetime'ın isoweekday () yöntemini çağırmaktır. İsoweekday () #output data, use \ t baskı ile ayrılmış '\ t'.join ()2. Dosyayı kovanın sınıf yoluna ekleyin
DOSYA /home/hadoop/weekday.py ekleyin;3. Unixtime'ı dönüştürmek ve yeni bir tablo eklemek için komut dosyasını kullanın
T_movie_rating FROM'python weekday.py'AS (movieid, rate, weekday, uid) KULLANARAK TABLO u_data_new asSELECTTRANSFORM (movieid, rate, unixtime, uid) OLUŞTUR;