2

я обычно загружать данные из Cassandra в Apache Спарк этот путь с помощью Java:Как преобразовать Cassandra ResultSet в Spark DataFrame?

SparkContext sparkContext = StorakleSparkConfig.getSparkContext(); 

CassandraSQLContext sqlContext = new CassandraSQLContext(sparkContext); 
    sqlContext.setKeyspace("midatabase"); 

DataFrame customers = sqlContext.cassandraSql("SELECT email, first_name, last_name FROM store_customer " + 
      "WHERE CAST(store_id as string) = '" + storeId + "'"); 

Но представьте себе, у меня есть sharder и мне нужно загрузить несколько ключей partion в этом DataFrame. Я мог бы использовать WHERE IN (...) в моем запросе и снова использовать метод cassandraSql. Но я немного неохотно использую WHERE IN из-за печально известной проблемы с одноточечным отказом в терминах узла-координатора. Это объясняется здесь:

https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

Есть ли способ использовать несколько запросов, но загрузить их в один DataFrame?

ответ

1

Один из способов сделать это - это запустить отдельные запросы и unionAll/union multiple DataFrames/RDD.

SparkContext sparkContext = StorakleSparkConfig.getSparkContext(); 

CassandraSQLContext sqlContext = new CassandraSQLContext(sparkContext); 
    sqlContext.setKeyspace("midatabase"); 

DataFrame customersOne = sqlContext.cassandraSql("SELECT email, first_name, last_name FROM store_customer " + "WHERE CAST(store_id as string) = '" + storeId1 + "'"); 

DataFrame customersTwo = sqlContext.cassandraSql("SELECT email, first_name, last_name FROM store_customer " + "WHERE CAST(store_id as string) = '" + storeId2 + "'"); 

DataFrame allCustomers = customersOne.unionAll(CustomersTwo) 
+1

Спасибо за ответ! Да, я подумал об этом, но не был уверен в производительности на стороне искры. Как вы думаете, есть ли они? –

+0

@MilenKovachev Union очень эффективен, так как он не требует перетасовки. Однако имейте в виду, что он может потенциально удалить ваш раздел. См. Здесь: http://stackoverflow.com/questions/29977526/in-apache-spark-why-does-rdd-union-does-not-preserve-partitioner –

+0

Предполагая, что у меня есть переменное количество ключей, которые мне нужно получить , Мне придется запускать запросы в цикле for. Есть ли способ запуска отдельных операторов sqlContext.cassandraSql параллельно? –