2017-12-27 15 views
1

私はspark-redshiftを使用していて、処理のためにpysparkを使ってredshiftデータを照会しています。[Amazon](500310)無効な操作:アサート

ワークベンチなどを使用してredshiftを実行するとクエリが正常に動作しますが、spark-redshiftはs3にデータをアンロードしてから取得し、実行すると次のエラーが発生します。

py4j.protocol.Py4JJavaError: An error occurred while calling o124.save. 
: java.sql.SQLException: [Amazon](500310) Invalid operation: Assert 
Details: 
----------------------------------------------- 
    error: Assert 
    code:  1000 
    context: !AmLeaderProcess - 
    query:  583860 
    location: scheduler.cpp:642 
    process: padbmaster [pid=31521] 
    -----------------------------------------------; 
    at com.amazon.redshift.client.messages.inbound.ErrorResponse.toErrorException(ErrorResponse.java:1830) 
    at com.amazon.redshift.client.PGMessagingContext.handleErrorResponse(PGMessagingContext.java:822) 
    at com.amazon.redshift.client.PGMessagingContext.handleMessage(PGMessagingContext.java:647) 
    at com.amazon.jdbc.communications.InboundMessagesPipeline.getNextMessageOfClass(InboundMessagesPipeline.java:312) 
    at com.amazon.redshift.client.PGMessagingContext.doMoveToNextClass(PGMessagingContext.java:1080) 
    at com.amazon.redshift.client.PGMessagingContext.getErrorResponse(PGMessagingContext.java:1048) 
    at com.amazon.redshift.client.PGClient.handleErrorsScenario2ForPrepareExecution(PGClient.java:2524) 
    at com.amazon.redshift.client.PGClient.handleErrorsPrepareExecute(PGClient.java:2465) 
    at com.amazon.redshift.client.PGClient.executePreparedStatement(PGClient.java:1420) 
    at com.amazon.redshift.dataengine.PGQueryExecutor.executePreparedStatement(PGQueryExecutor.java:370) 
    at com.amazon.redshift.dataengine.PGQueryExecutor.execute(PGQueryExecutor.java:245) 
    at com.amazon.jdbc.common.SPreparedStatement.executeWithParams(Unknown Source) 
    at com.amazon.jdbc.common.SPreparedStatement.execute(Unknown Source) 
    at com.databricks.spark.redshift.JDBCWrapper$$anonfun$executeInterruptibly$1.apply(RedshiftJDBCWrapper.scala:108) 
    at com.databricks.spark.redshift.JDBCWrapper$$anonfun$executeInterruptibly$1.apply(RedshiftJDBCWrapper.scala:108) 
    at com.databricks.spark.redshift.JDBCWrapper$$anonfun$2.apply(RedshiftJDBCWrapper.scala:126) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
Caused by: com.amazon.support.exceptions.ErrorException: [Amazon](500310) Invalid operation: Assert 

生成されますクエリ:

UNLOAD ('SELECT “x”,”y" FROM (select x,y from table_name where 
((load_date=20171226 and hour>=16) or (load_date between 20171227 and 
20171226) or (load_date=20171227 and hour<=16))) ') TO ‘s3:s3path' WITH 
CREDENTIALS ‘aws_access_key_id=xxx;aws_secret_access_key=yyy' ESCAPE 
MANIFEST 

何ここでの問題であり、どのように私はこの問題を解決することができます。

+0

のように明示的なデータフォーマットを追加してみてください。クエリを簡略化しようとしましたか?その大文字のラッパーは必要ありません。アサーションエラーは、通常、あるパートの列Nがvarcharであり、別の部分で同じ列が整数またはnullである2つの部分の「union」問合せなど、データ型の解釈に問題があるときに発生します。たぶんそれは、異なるノードから来るデータのアサーションエラーです。 – AlexYes

+0

実際には私が使っているクエリは内側の部分だけです。外側の部分(ラッパー)はs3.iにアンロードする必要があるため、spark-redshiftから生成されます。 –

+0

完全に生成されたクエリをワークベンチで使用するとどうなりますか?それは同じエラーを返しますか? – AlexYes

答えて

0

アサートエラーは通常、ある部分の列Nがvarcharであり、別の部分で同じ列が整数またはnullのunionクエリの2つの部分に対して、データ型の解釈に問題がある場合に発生します。たぶんあなたのアサーションエラーは、(ユニオンクエリのように)異なるノードから来るデータに対して起こるかもしれません。 x::integer

関連する問題