Scala 将列名称动态传递给cassandraTable()。选择()

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可以根据从文件解析的

我在运行时读取一个文件的查询,并在SPark+Cassandra环境中执行它

我正在执行:
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})