Scala 将列名称动态传递给cassandraTable()。选择()
我在运行时读取一个文件的查询,并在SPark+Cassandra环境中执行它 我正在执行:Scala 将列名称动态传递给cassandraTable()。选择(),scala,apache-spark,cassandra,spark-cassandra-connector,Scala,Apache Spark,Cassandra,Spark Cassandra Connector,我在运行时读取一个文件的查询,并在SPark+Cassandra环境中执行它 我正在执行: sparkContext.cassandraTable.(“keyspaceName”、“colFamilyName”)。选择(“col1”、“col2”、“col3”)。其中(“某些条件=true”) 文件中的查询: 选择col1、col2、col3 来自keyspaceName.colFamilyName 其中somecondition=true 这里的Col1、col2、col3可以根据从文件解析的
sparkContext.cassandraTable.(“keyspaceName”、“colFamilyName”)。选择(“col1”、“col2”、“col3”)。其中(“某些条件=true”)
文件中的查询:
选择col1、col2、col3
来自keyspaceName.colFamilyName
其中somecondition=true
这里的Col1、col2、col3可以根据从文件解析的查询而变化
问题:如何从查询中选择columnName并将其传递给select()和runtime 我已经尝试了很多方法:
1.做了最愚蠢的事(显然是犯了错误)—— 欢迎提出任何意见 旁注:
1.我不想使用CassandracContext,因为它将在下一个realase()中被去除/删除
2.我在
-a。Scala 2.11
-b。spark-cassandra-connector_2.11:1.6.0-M1
-c。Spark 1.6使用卡桑德拉连接器 您的用例听起来像您实际上想要使用
CassandraConnector
对象。这使您可以直接访问每个执行器的JVM会话池,非常适合执行随机查询。这将比为每个查询创建RDD更加高效
这看起来像
rddOfStatements.mapPartitions( it =>
CassandraConnector.withSessionDo { session =>
it.map(statement =>
session.execute(statement))})
但您很可能希望使用executeAsync
,并单独处理期货,以获得更好的性能
在cassandraTable中以编程方式指定列
select
方法采用ColumnRef*
,这意味着您需要传入一些ColumnRef
s。通常有一个从String
-->ColumnRef
的隐式转换,这就是为什么您可以只传入字符串的var args
这里有点复杂,因为我们想传递另一种类型的var args,所以我们最终得到了双隐式,Scala不喜欢这样
因此,我们将ColumnName
对象作为varargs(:*)传递
哇!!这是一个很好的方法。。。感谢@RussS的详细解释
columns.map(ColumnName()):*
工作得很有魅力..你救了我一天:)
rddOfStatements.mapPartitions( it =>
CassandraConnector.withSessionDo { session =>
it.map(statement =>
session.execute(statement))})
========================================
Keyspace: test
========================================
Table: dummy
----------------------------------------
- id : java.util.UUID (partition key column)
- txt : String
val columns = Seq("id", "txt")
columns: Seq[String] = List(id, txt)
//Convert the strings to ColumnNames (a subclass of ColumnRef) and treat as var args
sc.cassandraTable("test","dummy")
.select(columns.map(ColumnName(_)):_*)
.collect
Array(CassandraRow{id: 74f25101-75a0-48cd-87d6-64cb381c8693, txt: hello world})
//Only use the first column
sc.cassandraTable("test","dummy")
.select(columns.map(ColumnName(_)).take(1):_*)
.collect
Array(CassandraRow{id: 74f25101-75a0-48cd-87d6-64cb381c8693})
//Only use the last column
sc.cassandraTable("test","dummy")
.select(columns.map(ColumnName(_)).takeRight(1):_*)
.collect
Array(CassandraRow{txt: hello world})