2016-04-06 13 views
1

私はHive 1.2とSpark 1.4.1を使用しています。hiveContext経由のSpark JobでHive関数を使用する

hive> select row_number() over (partition by one.id order by two.id) as sk, 
two.id, two.name, one.name, current_date() 
from avant_source.one one 
inner join avant_source.two two 
on one.id = two.one_id; 

が、私はそれは私にエラーを与えるpysparkジョブでHiveContextを経由して、それを使用しよう:

py4j.protocol.Py4JJavaError: An error occurred while calling o26.sql. 
: java.lang.RuntimeException: Couldn't find function current_date 

コードスニペット:

from pyspark import HiveContext 

conf = SparkConf().setAppName('DFtest') 
sc = SparkContext(conf=conf) 
sqlContext = HiveContext(sc) 

df = sqlContext.sql("select row_number() over (partition by one.id order by two.id) as sk, two.id, two.name, one.name, current_date() from avant_source.one one inner join avant_source.two two on one.id = two.one_id") 

df.show() 

sc.stop() 
次のクエリでは、ハイブCLI経由で完全に正常に動作します

pysparkに現在の日付またはタイムスタンプを取得する方法はありますか?私はdatetimeをインポートしようとしましたが、関数が見つからないというエラーが常にスローされます。

pyspark 1.5 SandboxのData Framesでcurrent_dateを使用しようとしましたが、別のエラーも発生しました。

df = sqlContext.createDataFrame([(current_date,)],[‘d’]) 
df.select(date_sub(df.d,1).alias('d')).collect() 

エラー:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/mapr/spark/spark-1.5.2/python/pyspark/sql/dataframe.py", line 769, in select 
    jdf = self._jdf.select(self._jcols(*cols)) 
    File "/opt/mapr/spark/spark-1.5.2/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__ 
    File "/opt/mapr/spark/spark-1.5.2/python/pyspark/sql/utils.py", line 40, in deco 
    raise AnalysisException(s.split(': ', 1)[1]) 
pyspark.sql.utils.AnalysisException: cannot resolve 'datesub(d,1)' due to data type mismatch: argument 1 requires date type, however, 'd' is of struct<> type.; 

お知らせください。私のシナリオでは

+0

なぜF.current_date()を使用していますか? – eliasah

+0

シンプルなcurrent_date()が動作しなかったので、私はpとしてpyspark.sqlインポート関数から使用しようとしました。そしてそれはまたエラーを出していたが、F.を取ることを忘れてしまった。 – learning

答えて

0

が、私はハイブの機能のために正しくHiveQLためHiveContextを使用することができないの誤差については、次の

import datetime 
now = datetime.datetime.now() 
df = df.withColumn('eff_start', lit(now.strftime("%Y-%m-%d"))) 

を使用し、それがいずれかのノードHiveServer2上のクラスタの問題でしたメモリの問題のためにアラームが多すぎました。それが問題の原因でした。 Spark 1.5とHive 1.2を実行しているMapR Sandboxで正常にテストされました

関連する問題