您可以做的是将您的 RDD 读入 RDD[Row],然后将其更改为 DataFrame。我们唯一的问题是我们还需要 Schema。所以让我们分两步来做。
首先让我们以编程方式从我们的连接目标中获取架构
val schema = spark.read.cassandraFormat("dogabase", "test").load.schema
/**
schema: org.apache.spark.sql.types.StructType =
StructType(StructField(owner,StringType,true),
StructField(dog_id,IntegerType,true),
StructField(dog_age,IntegerType,true),
StructField(dog_name,StringType,true))
**/
然后我们可以从我们的 Cassandra 驱动程序中创建 org.apache.spark.sql.Row 对象
行。
import org.apache.spark.sql.Row
val joinResult =
sc.parallelize(Seq(Tuple1("Russ")))
.joinWithCassandraTable("test", "dogabase")
.map{ case(_, cassandraRow) => Row(cassandraRow.columnValues:_*)} //Unpack our Cassandra row values into a spark.sql.Row
现在我们有了一个模式和一个 RDD[Row],我们可以使用 spark session 的 createDataFrame 方法
val dataset = spark.createDataFrame(joinResult, schema)
dataset.show
/**
+-----+------+-------+--------+
|owner|dog_id|dog_age|dog_name|
+-----+------+-------+--------+
| Russ| 1| 10| cara|
| Russ| 2| 11|sundance|
+-----+------+-------+--------+
**/
如果你不相信 DataFrame 是一个数据集
dataset.getClass
Class[_ <: org.apache.spark.sql.DataFrame] = class org.apache.spark.sql.Dataset
编辑:可能需要的转换器
某些 Cassandra 类型不是 Spark Rows 的有效基础,因此您可能需要转换它们。这可以通过编写一个快速转换函数来完成。不幸的是,SCC 使用的内置转换是一种内部表示,因此我们无法使用这些转换。
def convertToSpark(element:Any): Any = {
case time: org.joda.time.LocalDate => time.toDateTimeAtStartOfDay().toDate //Convert to java.util.Date
case other => other
}
然后在制作行时
cassandraRow.columnValues.map(convertToSpark):_*