【问题标题】:Query cassandra table from spark without using case classes在不使用案例类的情况下从 spark 查询 cassandra 表
【发布时间】:2015-11-05 05:24:10
【问题描述】:

我正在使用datastax's connector 连接到 cassandra。

下面是我使用的代码,

import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import com.datastax.spark.connector._

val sqlContext = new SQLContext(sc)
val conf=new SparkConf(true)
.set("spark.cassandra.connection.host","127.0.0.1")
.set("spark.cassandra.auth.username","the_username")           
.set("spark.cassandra.auth.password","the_password")

val sc=new SparkContext("local","the_keyspace",conf)
val table_1 = sc.cassandraTable("the_keyspace","table_1")
val table_2 = sc.cassandraTable("the_keyspace","table_2")

现在,将此表公开为 RDD 的方法是使用案例类作为占位符,如下所示

case class Person(name: String, age: Int)
sc.cassandraTable[Person](“test”, “persons”).registerAsTable(“persons”)

这很好用,但我在每个表中有大约 50 多列,在案例类中输入它们并识别它们的类型真的很痛苦。

有没有办法克服这个问题?我习惯于使用 databricks-csv 将 csv 文件作为表来获取,我可以将它们注册为表并在不使用案例类占位符的情况下对其运行查询,这里是否有类似的用例。

如果没有,如果有一些生成器可以用来自动生成这些案例类,那将会很有帮助。

【问题讨论】:

    标签: scala apache-spark cassandra bigdata nosql


    【解决方案1】:

    您可以直接创建数据框:

    val df = sqlContext
       .read.format("org.apache.spark.sql.cassandra")
       .options(Map("keyspace" -> "test", "table" -> "persons"))
       .load()
    

    【讨论】:

    • 这就是你应该如何制作所有数据帧 :) 除非你首先有一个 RDD,否则不需要通过“registerAsTable”。
    • 这很简洁。但是如何使用 Spark SQL 查询它,我尝试使用 df.registerTempTable 将其注册为临时表,但它会引发错误,例如找不到方法。我知道数据框 API速度更快,但我现在正在使用很多查询模式进行概念验证,如果我可以使用 SQL 查询,那将会很有用。
    • 我无法重现该问题。您使用哪个版本的 Spark/Connector?
    • 我正在使用 1.4.1 (Spark), 1.5.0 M1 (connector) ,我还面临一些其他问题,例如无法执行常规数据帧 API 函数,例如 df.show,让我再说一遍。但这就是您正确的做法,以便能够运行 spark sql do df.registerTempTable ?
    • 我使用 Cassandra 2.1.8 / Spark 1.4.1 / 连接器1.4.0-M3。据我所知,一切都很好,至少在一些玩具数据上。
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多