2016-08-17 4 views
0

私は次のように定義されたHiveのテーブルを持っている:はBIGINTとINT比較障害

create table testforerror (
    my_column MAP<BIGINT, ARRAY<String>> 
); 

テーブル持って次のレコード

hive> select * from testforerror; 
OK 
{16001:["0034000000a4WDAAA2"]} 
{16001:["0034000000orWiFAAU"]} 
{16001:["","0034000000VgrHdAAJ"]} 
{16001:["0034000000cS4tDAAS"]} 
{15001:["0037000001a7ofgAAA"]} 
Time taken: 0.067 seconds, Fetched: 5 row(s) 

Iキーでレコードをフィルタクエリを持っていますmy_columnの

hive> select * from testforerror where my_column[16001] is not null; 
OK 
{16001:["0034000000a4WDAAA2"]} 
{16001:["0034000000orWiFAAU"]} 
{16001:["","0034000000VgrHdAAJ"]} 
{16001:["0034000000cS4tDAAS"]} 
Time taken: 2.224 seconds, Fetched: 4 row(s) 

をしかし、私はエラーを取得するしかし、スパークsqlContextから実行しようとしたとき:このクエリは、ハイブ/ビーラインシェルから罰金を実行すると、次のレコードを産れ

select * from testforerror where my_column[16001] is not null; 

を次のようにクエリがあります。以下は、エラーメッセージです。

scala> val errorquery = "select * from testforerror where my_column[16001] is not null" 
errorquery: String = select * from testforerror where my_column[16001] is not null 

scala> sqlContext.sql(errorquery).show() 
org.apache.spark.sql.AnalysisException: cannot resolve 'my_column[16001]' due to data type mismatch: argument 2 requires bigint type, however, '16001' is of int type.; line 1 pos 43 
    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:65) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335) 
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:69) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:334) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:332) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:332) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:281) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:727) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48) 
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:103) 
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:47) 

すべてのポインタは非常に有用です、ありがとう。

答えて

0

代わりにSQLとブラケット表記のDSLとgetItem方法を使用することができます。

sqlContext.table("testforerror").where($"mycolumn".getItem(1L).isNotNull) 
+0

これは役立つだろうが、私のクエリは非常に複雑であると私は詳細をマスクしようとしたとして、私はDSLに切り替えることはできません。ありがとう。 –

+0

私はもう別のオプションがあるとは思わない。あなたは[JIRA](https://issues.apache.org/jira/browse/SPARK)を開く必要があります。 – zero323