package spark
import java.util.Properties
import org.apache.spark.SparkContext
import org.apache.spark.sql.{Row, SaveMode}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
/**
* Created by sunfei on 2017/7/7. OK
*/
object sparkTOsql {
def main(args: Array[String]): Unit = {
val url = "jdbc:mysql://10.10.10.158:3306/spark?user=root&password=123456"
val sc = new SparkContext
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val schema = StructType(
StructField("name", StringType) ::
StructField("count", IntegerType)
:: Nil)
val data = sc.parallelize(List(("www", 30), ("baidu", 29),
("com", 40), ("bt", 33), ("cn", 23))).
map(item => Row.apply(item._1, item._2))
import sqlContext.implicits._
val df = sqlContext.createDataFrame(data, schema)
// df.createJDBCTable(url, "bolg", false)
// df.insertIntoJDBC(url, "blog", false)
val url2 = "jdbc:mysql://10.10.10.158:3306/spark"
val connectionProperties2 = new Properties()
connectionProperties2.setProperty("user", "root");// 设置用户名
connectionProperties2.setProperty("password", "123456");// 设置密码
df.write.mode(SaveMode.Append).jdbc(url2, "blog", connectionProperties2)
sc.stop
}
}
前面是关于rdd转换成DF的操作 新建一个scheme 然后对应
SparkSQL提供了两种方式把RDD转换为DataFrame。
第一种通过反射(前提是知道schema),第二种通过提供的接口创建schema。
通过反射:
scala提供了一种通过case class把RDD转换为DataFrame,case clasee定义了表结构,通过反射的方式读取参数并转换为字段,case class也可以是嵌套的复杂序列或数组。这样RDD就可以隐式的转换为DataFrame,df再注册为内存表,就可以通过sql操作此表。
当某些情况下case class不能提前定义时,就用这种方法,一般分三步:
1.通过原始RDD创建RDD的Rows
2.通过StructType匹配RowS里的结构创建schema
3.通过SQLContext提供的createDataFrame(row,schema)方法创建DataFrame
例:scala
后面的是df写入到数据库
- // SaveMode.Append:在数据源后添加;
- // SaveMode.Overwrite:如果如果数据源已经存在记录,则覆盖;
- // SaveMode.ErrorIfExists:如果如果数据源已经存在记录,则包异常;
- // SaveMode.Ignore:如果如果数据源已经存在记录,则忽略;
执行命令 spark-submit --master local --class spark.sparkTOsql --driver-class-path /home/mysql-connector-java-5.1.12-bin.jar /home/tetsql2.jar