Ⅰ hive 調用python 寫的udf 報錯
你把print寫在try裡面當然會少數據。你應該try訪問fields數組並更新fields[2]的值。另一方面,從功能點上虧弊來說,使用SQL函數nvl或coalesce就能實現,沒必要寫個UDF來悄段實現,你這銷運族樣做增加額外的IO消耗和工作量。如果一定要寫UDF,建議少用print,改用標准輸出實現:sys.stdout.write()。
Ⅱ 大數據開發常用的編程語言有哪些
1、Python語言
如果你的數據科學家不使用R,他們可能就會徹底了解Python。十多年來,Python在學術界當中一直很流行,尤其是在自然語言處理(NLP)等領域。因而,如果你有一個需要NLP處理的項目,就會面臨數量多得讓人眼花繚亂的選擇,包括經典的NTLK、使用GenSim的主題建模,或者超快、准確的spaCy。同樣,說到神經網路,Python同樣游刃有餘,有Theano和Tensorflow;隨後還有面向機器學習的scikit-learn,以及面向數據分析的NumPy和Pandas。
還有Juypter/iPython――這種基於Web的筆記本伺服器框架讓你可以使用一種可共享的日誌格式,將代碼、圖形以及幾乎任何對象混合起來。這一直是Python的殺手級功能之一,不過這年頭,這個概念證明大有用途,以至於出現在了奉行讀取-讀取-輸出-循環(REPL)概念的幾乎所有語言上,包括Scala和R。
Python往往在大數據處理框架中得到支持,但與此同時,它往往又不是「一等公民」。比如說,Spark中的新功能幾乎總是出現在Scala/Java綁定的首位,可能需要用PySpark編寫面向那些更新版的幾個次要版本(對Spark Streaming/MLLib方面的開發工具而言尤為如此)。
與R相反,Python是一種傳統的面向對象語言,所以大多數開發人員用起來會相當得心應手,而初次接觸R或Scala會讓人心生畏懼。一個小問題就是你的代碼中需要留出正確的空白處。這將人員分成兩大陣營,一派覺得「這非常有助於確保可讀性」,另一派則認為,我們應該不需要就因為一行代碼有個字元不在適當的位置,就要迫使解釋器讓程序運行起來。
2、R語言
在過去的幾年時間中,R語言已經成為了數據科學的寵兒——數據科學現在不僅僅在書獃子一樣的統計學家中人盡皆知,而且也為華爾街交易員,生物學家,和矽谷開發者所家喻戶曉。各種行業的公司,例如Google,Facebook,美國銀行,以及紐約時報都使用R語言,R語言正在商業用途上持續蔓延和擴散。
R語言有著簡單而明顯的吸引力。使用R語言,只需要短短的幾行代碼,你就可以在復雜的數據集中篩選,通過先進的建模函數處理數據,以及創建平整的圖形來代表數字。它被比喻為是Excel的一個極度活躍版本。
R語言最偉大的資本是已圍繞它開發的充滿活力的生態系統:R語言社區總是在不斷地添加新的軟體包和功能到它已經相當豐富的功能集中。據估計,超過200萬的人使用R語言,並且最近的一次投票表明,R語言是迄今為止在科學數據中最流行的語言,被61%的受訪者使用(其次是Python,39%)。
3、JAVA
Java,以及基於Java的框架,被發現儼然成為了矽谷最大的那些高科技公司的骨骼支架。 「如果你去看Twitter,LinkedIn和Facebook,那麼你會發現,Java是它們所有數據工程基礎設施的基礎語言,」Driscoll說。
Java不能提供R和Python同樣質量的可視化,並且它並非統計建模的最佳選擇。但是,如果你移動到過去的原型製作並需要建立大型系統,那麼Java往往是你的最佳選擇。
4、Hadoop和Hive
一群基於Java的工具被開發出來以滿足數據處理的巨大需求。Hadoop作為首選的基於Java的框架用於批處理數據已經點燃了大家的熱情。Hadoop比其他一些處理工具慢,但它出奇的准確,因此被廣泛用於後端分析。它和Hive——一個基於查詢並且運行在頂部的框架可以很好地結對工作。
Ⅲ 用python 實現 hive sql join和row_number
給定一個查詢時間,找最近登錄的用戶
create temporary function row_number as "com.ai.hive.udf.util.RowNumberUDF";
select logint_time,username from
( select ip,login_time,username from (
select ip ,select_time from a join select ip,login_time,username from b on(a.ip=b.ip and a.login_time
)t sort by login_time desc )p where row_number=1
import pandas as pd
import numpy as np
login_column_names = ['ip','dip','type','uri','time']
select_column_names = ['ip'逗衫,'dip','action','time']
df_login = pd.read_csv('login.txt',sep='\t',encoding='utf-8',header=None,names=login_column_names)
df_select = pd.read_csv('select.txt',sep='\t',encoding='utf-8',header=None,names=select_column_names)
df_login[['username','password','authPassword','submit']]= df_login['uri'].str.replace('j_username=','').str.replace('password=','').str.split('&',expand=True)
df_login
x=[1,2,3,6,7,8]
df_login.drop(df_login.columns[x], axis=1, inplace=True)
df_login
import time
# time.strptime(df_login['time'],"%Y-%m-%d %H:%M:%S")
df_login['time']
df_login['new_time']=0
a = 0
for x in df_login['困畢time']:
print(int(time.mktime(time.strptime(x,"%Y-%m-%d %H:%M:%S.%f"))))
df_login['汪指芹new_time'][a] = int(time.mktime(time.strptime(x,"%Y-%m-%d %H:%M:%S.%f")))
a=a+1
df_login['new_time']
import time
# time.strptime(df_login['time'],"%Y-%m-%d %H:%M:%S")
df_select['time']
df_select['new_time']=0
a = 0
for x in df_select['time']:
print(int(time.mktime(time.strptime(x,"%Y-%m-%d %H:%M:%S.%f"))))
df_select['new_time'][a] = int(time.mktime(time.strptime(x,"%Y-%m-%d %H:%M:%S.%f")))
a=a+1
df_select
df_on = df_select.merge(df_login,how='left',on=['ip'])
df_on
df_on['diff_time'] = df_on['new_time_x']-df_on['new_time_y']
df_on
df_on[df_on['diff_time']>=0]
#找時間最小的那個
df_on = df_on[df_on['diff_time']>=0]
df_on
df_on[['ip','time_x','username','diff_time']]
def min_time(df,n=3,column='diff_time'):
return df.sort_index(by=column,ascending=False)[-n:]
df_on[['ip','time_x','username','diff_time']].groupby(['ip','time_x']).apply(min_time,n=1)
Ⅳ hive中如何調用python函數
ADD FILE /亂答稿home/taobao/dw_hive/hivelets/smoking/ext/tsa/hivesql/bjx_topic_t1/splitsysin.py.bak;
create table if not exists splittest_t1
(
topic_id string,
topic_title string,
topic_desc string,
biz_date string,
gmt_create string
) PARTITIONED BY(pt string)
row format delimited fields terminated by '\001'
lines terminated by '\n'嘩孝舉槐
STORED AS textfile;
select TRANSFORM(topic_id,topic_title,topic_desc,biz_date,gmt_create)
USING 'splitsysin.py'
as topic_id,topic_title,topic_desc,biz_date,gmt_create
from r_bjx_dim_topic_t1;
Ⅳ python連接hive的時候必須要依賴sasl類庫嗎
客戶端連接Hive需要使用HiveServer2。HiveServer2是HiveServer的重寫版本,HiveServer不支持多個客戶端的並發請求。當前HiveServer2是基於Thrift RPC實現的。它被設計用於為像JDBC、ODBC這樣的開發API客戶端提供更好的支持。Hive 0.11版本引入的HiveServer2。
HiveServer2的啟動
啟動HiveServer2
HiveServer2的啟動十分簡便:
$ $HIVE_HOME/bin/hiveserver2
或者
$ $HIVE_HOME/bin/hive --service hiveserver2
默認情況下,HiverServer2的Thrift監聽埠是10000,其WEB UI埠是10002。可通過來查看HiveServer2的Web UI界面,這里顯示了Hive的一些基本信息。如果Web界面不能查看,則說明HiveServer2沒有成功運行。
使用beeline測試客戶端連接
HiveServer2成功運行後,我們可以使用Hive提供的客戶端工具beeline連接HiveServer2。
$ $HIVE_HOME/bin/beeline
beeline > !connect jdbc:hive2://localhost:10000
如果成功登錄將出現如下的命令提示符,此時可以編寫HQL語句。
0: jdbc:hive2://localhost:10000>
報錯:User: xxx is not allowed to impersonate anonymous
在beeline使用!connect連接HiveServer2時可能會出現如下錯誤信息:
12Caused by: org.apache.hadoop.ipc.RemoteException:User: xxx is not allowed to impersonate anonymous這里的xxx是我的操作系統用戶名稱。這個問題的解決方法是在hadoop的core-size.xml文件中添加xxx用戶代理配置:
123456789<spanclass="hljs-tag"><<spanclass="hljs-title">property><spanclass="hljs-tag"><<spanclass="hljs-title">name>hadoop.proxyuser.xxx.groups<spanclass="hljs-tag"></<spanclass="hljs-title">name><spanclass="hljs-tag"><<spanclass="hljs-title">value>*<spanclass="hljs-tag"></<spanclass="hljs-title">value><spanclass="hljs-tag"></<spanclass="hljs-title">property><spanclass="hljs-tag"><<spanclass="hljs-title">property><spanclass="hljs-tag"><<spanclass="hljs-title">name>hadoop.proxyuser.xxx.hosts<spanclass="hljs-tag"></<spanclass="hljs-title">name><spanclass="hljs-tag"><<spanclass="hljs-title">value>*<spanclass="hljs-tag"></<spanclass="hljs-title">value><spanclass="hljs-tag"></<spanclass="hljs-title">property></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>重啟HDFS後,再用beeline連接HiveServer2即可成功連接。
常用配置
HiveServer2的配置可以參考官方文檔《Setting Up HiveServer2》
這里列舉一些hive-site.xml的常用配置:
hive.server2.thrift.port:監聽的TCP埠號。默認為10000。
hive.server2.thrift.bind.host:TCP介面的綁定主機。
hive.server2.authentication:身份驗證方式。默認為NONE(使用 plain SASL),即不進行驗證檢查。可選項還有NOSASL, KERBEROS, LDAP, PAM and CUSTOM.
hive.server2.enable.doAs:是否以模擬身份執行查詢處理。默認為true。
Python客戶端連接HiveServer2
python中用於連接HiveServer2的客戶端有3個:pyhs2,pyhive,impyla。官網的示例採用的是pyhs2,但pyhs2的官網已聲明不再提供支持,建議使用impyla和pyhive。我們這里使用的是impyla。
impyla的安裝
impyla必須的依賴包括:
six
bit_array
thriftpy(python2.x則是thrift)
為了支持Hive還需要以下兩個包:
sasl
thrift_sasl
可在Python PI中下載impyla及其依賴包的源碼。
impyla示例
以下是使用impyla連接HiveServer2的示例:
1234567891011Ⅵ python連接hive,怎麼安裝thrifthive
HiveServer2的啟動
啟動HiveServer2
HiveServer2的啟動十分簡便:
$ $HIVE_HOME/bin/hiveserver2
或者
$ $HIVE_HOME/bin/hive --service hiveserver2
默認情況下,HiverServer2的Thrift監聽埠是10000,其WEB UI埠是10002。可通過http://localhost:10002來查看HiveServer2的Web UI界面,這里顯示了Hive的一些基本信息。如果Web界面不能查看,則說明HiveServer2沒有成功運行。
使用beeline測試客戶端連接
HiveServer2成功運行後,我們可以使用Hive提供的客戶端工具beeline連接HiveServer2。
$ $HIVE_HOME/bin/beeline
beeline > !connect jdbc:hive2://localhost:10000
如果成功登錄將出現如下的命令提示符,此時可以編寫HQL語句。
0: jdbc:hive2://localhost:10000>
報錯:User: xxx is not allowed to impersonate anonymous
在beeline使用!connect連接HiveServer2時可能會出現如下錯誤信息:
Caused by: org.apache.hadoop.ipc.RemoteException:
User: xxx is not allowed to impersonate anonymous
這里的xxx是我的操作系統用戶名稱。這個問題的解決方法是在hadoop的core-size.xml文件中添加xxx用戶代理配置:
<property> <name>hadoop.proxyuser.xxx.groups</name> <value>*</value></property><property> <name>hadoop.proxyuser.xxx.hosts</name> <value>*</value></property>
重啟HDFS後,再用beeline連接HiveServer2即可成功連接。
常用配置
HiveServer2的配置可以參考官方文檔《Setting Up HiveServer2》
這里列舉一些hive-site.xml的常用配置:
hive.server2.thrift.port:監聽的TCP埠號。默認為10000。
hive.server2.thrift.bind.host:TCP介面的綁定主機。
hive.server2.authentication:身份驗證方式。默認為NONE(使用 plain SASL),即不進行驗證檢查。可選項還有NOSASL, KERBEROS, LDAP, PAM and CUSTOM.
hive.server2.enable.doAs:是否以模擬身份執行查詢處理。默認為true。
Python客戶端連接HiveServer2
python中用於連接HiveServer2的客戶端有3個:pyhs2,pyhive,impyla。官網的示例採用的是pyhs2,但pyhs2的官網已聲明不再提供支持,建議使用impyla和pyhive。我們這里使用的是impyla。
impyla的安裝
impyla必須的依賴包括:
six
bit_array
thriftpy(python2.x則是thrift)
為了支持Hive還需要以下兩個包:
sasl
thrift_sasl
可在Python PI中下載impyla及其依賴包的源碼。
impyla示例
以下是使用impyla連接HiveServer2的示例:
Ⅶ Python 連接hive(Linux)
之所以選擇基於Linux系統用Python連接hive,是因為在window下會出現Hadoop認證失敗的問題。會出現執行python腳本的機器無目標hive的kerberos認證信息類似錯誤,也會出現sasl調用問題:
該錯誤我嘗試多次,未能解決(有知道window下解決方案的歡迎留言),所以建議使用Linux系統。
VMware Workstation +Ubuntu
網上教程很多,本文推薦一個教程: https://blog.csdn.net/stpeace/article/details/78598333
主要是以下四個包:
在安裝包sasl的過程會出現麻煩,主要是Ubuntu中缺乏sasl.h的問題,這里可以通過下面語句解決
這和centos有一些區別。
本文是基於本機虛擬機用Python連接的公司測試環境的hive(生產環境和測試環境是有隔離的,生產環境需要堡壘機才能連接)
因缺乏工程和計算機基礎的知識,對很多的地方都了解的不夠深入,歡迎大神指點,最後向以下兩位大佬的帖子致謝:
[1] https://www.hu.com/question/269333988/answer/581126392
[2] https://mp.weixin.qq.com/s/cdFxkphMtJASQ7-nKt13mg
Ⅷ redcode=-1載入失敗
在寫MapRece程序時,在本地運行使用cat file.data | python mapper.py | sort k1,1 | python recer.py >result.data進行測試時,程序可以輸出正確結果,程序運行正常,但是在編寫shell腳本提交在hadoop集群進行運算時,出現了"PipeMapRed.waitOutputThreads(): subprocess failed with code 1"的報錯,在查詢解決方法的過程中,找到了稿並如下幾種解決問題的思路:
1、輸入輸出文件沒有讀寫許可權,導致出現這個報凱脊錯,但是我在查看自己的文件目錄的許可權,發現不是自己的文件許可權問題,具體許可權是否會導致這種問題,我也不太清楚,僅供參考;
2、不同機器的python的環境路徑不同,這個我把程序都改成了#!/usr/bin/python,再次執行,發現同樣沒有解決問題,依然報同樣的錯誤;
3、查詢Stack Overflow上面有的說法是python程序可能有問題,這個說法我一開始是不贊成的,因為我已經本地測試通過的。
於是在這個問題上卡了兩個小時,在找到如何將日誌文件拖到本體的方法後,拖取命令如下: yarn logs -applicationId application_1519803790630_15391 > temp1.log ,其中的application_1519803790630_15391根據自己任務盯敬滲的名稱替換,查看其中Traceback部分錯誤提示,發現是自己在本地寫的一個包在集群上找不到,提示import錯誤。把import包中函數放入mapper程序後,再次運行,問題被解決!!!!!!!
故:遇到這種報錯的解決思路:首先取到程序運行日誌,再分析日誌中出現錯誤的原因,據測試,這種報錯基本是由於程序錯誤導致的!!!!即使本地測試通過,在提交hadoop執行後,一旦報錯也要根據錯誤日誌進行程序更改!