2016-07-21 9 views
0

事は、1ヶ月の月とday.But私は2016/04/24からのデータを正しく読んでいないパーティションです1つのテーブルを右に読んだことです。 私はハイブコマンドで実行します。sparkでテーブル全体のロードを停止するには?

hive>select * from table where year="2016" and month="06" and day="01"; 

私は2016年4月24日

以外の日のデータを読み取ることができます。しかし、私はスパークに読んだとき

sqlContext.sql.sql(select * from table where year="2016" and month="06" and day="01") 

exceptitionはそのThrowableです私はhdfs /.../ 2016/04/24の権利を持っていません。

このショースパークSQLは、一度だけ全部をロードしてフィルタしますか? 全テーブルを読み込まないようにするにはどうすればよいですか?

答えて

1

JdbcRDDを直接使用することができます。それを使用するとスパークSQLエンジンをバイパスすることができますので、クエリは直接ハイブに送信されます。

JdbcRDDを使用するには、ハイブドライバを作成して最初に登録する必要があります(もちろん登録されていません)。

val driver = "org.apache.hive.jdbc.HiveDriver" 
Class.forName(driver) 

次に、JdbcRDDを作成できます。

val connUrl = "jdbc:hive2://..." 
val query = """select * from table where year="2016" and month="06" and day="01" and ? = ?""" 
val lowerBound = 0 
val upperBound = 0 
val numOfPartitions = 1 
new JdbcRDD(
    sc, 
    () => DriverManager.getConnection(connUrl), 
    query, 
    lowerBound, 
    upperBound, 
    numOfPartitions, 
    (r: ResultSet) => (r.getString(1) /** get data here or with a function**/) 
) 

JdbcRDDクエリは、データを分割作成するために、2つの?を持っている必要があります。だから私よりも良いクエリを書くべきです。これは、それがどのように動作するかを示す1つのパーティションを作成するだけです。

ただし、これを行う前に、HiveContextをチェックすることをおすすめします。これはHiveQLもサポートします。 thisを確認してください。

関連する問題