Spark Scala Cassandra CSV插入Cassandra
代码如下: Scala版本:2.11。 Spark版本:2.0.2.6 Cassandra版本:cqlsh 5.0.1 | Cassandra 3.11.0.1855 | DSE 5.1.3 | CQL规范3.4.4 |本机协议v4 我正在尝试从CSV读取数据并写入Cassandra表。我是Scala和Spark的新手。请纠正我哪里做错了Spark Scala Cassandra CSV插入Cassandra,scala,csv,apache-spark,intellij-idea,cassandra,Scala,Csv,Apache Spark,Intellij Idea,Cassandra,代码如下: Scala版本:2.11。 Spark版本:2.0.2.6 Cassandra版本:cqlsh 5.0.1 | Cassandra 3.11.0.1855 | DSE 5.1.3 | CQL规范3.4.4 |本机协议v4 我正在尝试从CSV读取数据并写入Cassandra表。我是Scala和Spark的新手。请纠正我哪里做错了 import org.apache.spark.sql.SparkSession import org.apache.log4j.{Level, Logger
import org.apache.spark.sql.SparkSession
import org.apache.log4j.{Level, Logger}
import com.datastax
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import com.datastax.spark.connector._
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType}
import org.apache.spark.sql._
import com.datastax.spark.connector.UDTValue
import com.datastax.spark.connector.mapper.DefaultColumnMapper
object dataframeset {
def main(args: Array[String]): Unit = {
// Cassandra Part
val conf = new SparkConf().setAppName("Sample1").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.setLogLevel("ERROR")
val rdd1 = sc.cassandraTable("tdata", "map")
rdd1.collect().foreach(println)
// Scala Read CSV Part
Logger.getLogger("org").setLevel(Level.ERROR)
Logger.getLogger("akka").setLevel(Level.ERROR)
val spark1 = org.apache.spark.sql.SparkSession
.builder()
.master("local")
.appName("Spark SQL basic example")
.getOrCreate()
val df = spark1.read.format("csv")
.option("header","true")
.option("inferschema", "true")
.load("/Users/tom/Desktop/del2.csv")
import spark1.implicits._
df.printSchema()
val dfprev = df.select(col = "Year","Measure").filter("Category = 'Prevention'" )
// dfprev.collect().foreach(println)
val a = dfprev.select("YEAR")
val b = dfprev.select("Measure")
val collection = sc.parallelize(Seq(a,b))
collection.saveToCassandra("tdata", "map", SomeColumns("sno", "name"))
spark1.stop()
}
}
错误:
Exception in thread "main" java.lang.IllegalArgumentException: Multiple constructors with the same number of parameters not allowed.
卡桑德拉表
cqlsh:tdata>desc映射
创建表tdata.map(
sno int主键,
名称文本
我知道我遗漏了一些东西,尤其是试图一次将整个数据帧写入Cassandra。不,我也不知道需要做什么
谢谢
tom您可以直接向cassandra写入数据帧(spark 2.x中的dataset[Row]) 如果在spark conf中启用了身份验证,则必须定义cassandra主机、用户名和密码,以便使用类似的方式连接到cassandra
val conf = new SparkConf(true)
.set("spark.cassandra.connection.host", "CASSANDRA_HOST")
.set("spark.cassandra.auth.username", "CASSANDRA_USERNAME")
.set("spark.cassandra.auth.password", "CASSANDRA_PASSWORD")
或
为什么不使用cqlsh copy命令?这是因为我不需要整个CSV,我需要在加载它们之前应用过滤器和转换HI,感谢更新。一个简单的问题。我如何用列名映射数据,因为CSV中的“年”应该转到“年添加”列,“度量”应该转到“记录”列。您可以使用spark的
.alias
或.as
api更改列名称。我已更新了答案
val spark1 = org.apache.spark.sql.SparkSession
.builder()
.master("local")
.config("spark.cassandra.connection.host", "CASSANDRA_HOST")
.config("spark.cassandra.auth.username", "CASSANDRA_USERNAME")
.config("spark.cassandra.auth.password", "CASSANDRA_PASSWORD")
.appName("Spark SQL basic example")
.getOrCreate()
val dfprev = df.filter("Category = 'Prevention'" ).select(col("Year").as("yearAdded"),col("Measure").as("Recording"))
dfprev .write
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "map", "keyspace" -> "tdata"))
.save()