2017-03-24 19 views
1

私はPythonを使用してAWS Athenaに接続しようとしています。私はこの作業を達成するためにpyathenajdbcを使用しようとしています。私が持っている問題は、接続を得ることです。以下のコードを実行すると、AthenaDriverが見つからないというエラーメッセージが表示されます。 (java.lang.RuntimeException:クラスcom.amazonaws.athena.jdbc.AthenaDriverが見つかりません)。私はAWSからこのファイルをダウンロードし、そのディレクトリに座っていることを確認しました。PythonとPyathenajdbcを使用してAthenaに接続

from mdpbi.rsi.config import * 
from mdpbi.tools.functions import mdpLog 
from pkg_resources import resource_string 
import argparse 
import os 
import pyathenajdbc 
import sys 

SCRIPT_NAME = "Athena_Export" 

ATHENA_JDBC_CLASSPATH = "/opt/amazon/athenajdbc/AthenaJDBC41-1.0.0.jar" 
EXPORT_OUTFILE = "RSI_Export.txt" 
EXPORT_OUTFILE_PATH = os.path.join(WORKINGDIR, EXPORT_OUTFILE) 


def get_arg_parser(): 
    """This function returns the argument parser object to be used with this script""" 
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) 

    return parser 


def main(): 
    args = get_arg_parser().parse_args(sys.argv[1:]) 
    logger = mdpLog(SCRIPT_NAME, LOGDIR) 

    SQL = resource_string("mdpbi.rsi.athena.resources", "athena.sql") 

    conn = pyathenajdbc.connect(
     s3_staging_dir="s3://athena", 
     access_key=AWS_ACCESS_KEY_ID, 
     secret_key=AWS_SECRET_ACCESS_KEY, 
     region_name="us-east-1", 
     log_path=LOGDIR, 
     driver_path=ATHENA_JDBC_CLASSPATH 
    ) 
    try: 
     with conn.cursor() as cursor: 
      cursor.execute(SQL) 
      logger.info(cursor.description) 
      logger.info(cursor.fetchall()) 
    finally: 
     conn.close() 

    return 0 


if __name__ == '__main__': 
    rtn = main() 
    sys.exit(rtn) 

トレースバック(最後の最新の呼び出し): "メイン" _run_module_as_main に "/usr/lib64/python2.7/runpy.py"、ライン174を、ファイル、fnameは、ローダー、 pkg_name)ファイル "/usr/lib64/python2.7/runpy.py"、行72、_run_code run_globalsファイルの実行コード "/ home/ec2-user/jason_testing/mdpbi/rsi/athena/メイン .py "、行53、 の rtn = main()ファイル"/home/ec2-user/jason_testing/mdpbi/rsi/athena/メイン .py "39行目、接続 driver_pathの主 driver_path = athena_jdbc_driver_pathファイル "/opt/mdpbi/Python_Envs/2.7.10/local/lib/python2.7/dist-packages/pyathenajdbc/ のinitの.py"、 ライン65で 、 、** kwargs)ファイル "/opt/mdpbi/Python_Envs/2.7.10/local/lib/python2.7/dist-packages/pyathenajdbc/connection.py"、 行68、 jpype.JClass ATHENA_DRIVER_CLASS_NAME)ファイル "/opt/mdpbi/Python_Envs/2.7.10/lib64/python2.7/dist-packages/jpype/_jclass.py"、 行55、JClass内 raise _RUNTIMEEXCEPTION.PYEXC( "クラス%sが見つかりません"%name)

+0

あなたが(低レベル)のpythonから直接アテナを使用することができますpyathenajdbc以外のものを使用することを許可されている場合:http://boto3.readthedocs.io/en/latest/reference/services/athena.htmlは、これが与えますあなたはもっとpythonicインターフェイスです:https://github.com/laughingman7743/PyAthena – mark

答えて

3

JDBCドライバは、Java 8.私は現在、私がすることができたのJava 7を実行していたが必要ですEC2インスタンスに別のバージョンのJavaをインストールします。

https://tecadmin.net/install-java-8-on-centos-rhel-and-fedora/#

また、私は私のコードでJavaのバージョンを設定する必要がありました。これらの変更により、コードは期待どおりに実行されます。

from mdpbi.rsi.config import * 
from mdpbi.tools.functions import mdpLog 
from pkg_resources import resource_string 
import argparse 
import os 
import pyathenajdbc 
import sys 

SCRIPT_NAME = "Athena_Export" 


def get_arg_parser(): 
    """This function returns the argument parser object to be used with this script""" 
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) 

    return parser 


def main(): 
    args = get_arg_parser().parse_args(sys.argv[1:]) 
    logger = mdpLog(SCRIPT_NAME, LOGDIR) 

    SQL = resource_string("mdpbi.rsi.athena.resources", "athena.sql") 

    os.environ["JAVA_HOME"] = "/opt/jdk1.8.0_121" 
    os.environ["JRE_HOME"] = "/opt/jdk1.8.0_121/jre" 
    os.environ["PATH"] = "/opt/jdk1.8.0_121/bin:/opt/jdk1.8.0_121/jre/bin" 

    conn = pyathenajdbc.connect(
     s3_staging_dir="s3://mdpbi.data.rsi.out/", 
     access_key=AWS_ACCESS_KEY_ID, 
     secret_key=AWS_SECRET_ACCESS_KEY, 
     schema_name="rsi", 
     region_name="us-east-1" 
    ) 
    try: 
     with conn.cursor() as cursor: 
      cursor.execute(SQL) 
      logger.info(cursor.description) 
      logger.info(cursor.fetchall()) 
    finally: 
     conn.close() 

    return 0 


if __name__ == '__main__': 
    rtn = main() 
    sys.exit(rtn) 
2

これを試してみてください:

pyathenajdbc.ATHENA_JAR = ATHENA_JDBC_CLASSPATH 

あなたは接続方法にdriver_path引数を指定する必要がされることはありません

+0

コードにpyathenajdbc.ATHENA_JAR = ATHENA_JDBC_CLASSPATHを追加し、接続呼び出しでdriver_path = ATHENA_JDBC_CLASSPATHをコメントアウトしました。私はこれがJavaのバージョンの問題かもしれないと思っています –

関連する問題