SparkSql 处理各种数据源

SparkSql的各种数据源

1.JDBC

首先创建程序入口和jdbc连接:
得到的是DataFrame类型数据:

val spark = SparkSession.builder().appName("JdbcDataSource")
  .master("local[*]")
  .getOrCreate()

import spark.implicits._
//load这个方法不会读取真正mysql的数据
//属于转换操作
val logs: DataFrame = spark.read.format("jdbc").options(
  Map("url" -> "jdbc:mysql://localhost:3306/bigdata",
    "driver" -> "com.mysql.jdbc.Driver",
    "dbtable" -> "logs",
    "user" -> "root",
    "password" -> "123568")
).load()

对Mysql的数据进行处理:

//1.打印出表信息
logs.printSchema()
logs.show()
//2.对表进行过滤等操作
val filtered: Dataset[Row] = logs.filter(r => {
  r.getAs[Int]("age") <= 13
})
filtered.show()
//也可使用lambda表达式
val r = logs.filter($"age" <= 13)
//调用Dataset的API
val r = logs.where($"age" <= 13)
val reslut: DataFrame = r.select($"id", $"name", $"age" * 10 as "age")

将处理的数据写入其他数据格式中:
1.写入Mysql

//1.写入Mysql
val props = new Properties()
props.put("user","root")
props.put("password","123568")
reslut.write.mode("ignore").jdbc("jdbc:mysql://localhost:3306/bigdata", "logs1", props)

注意此处的mode

//mode方法源码
def mode(saveMode: String): DataFrameWriter[T] = {
  this.mode = saveMode.toLowerCase(Locale.ROOT) match {
    case "overwrite" => SaveMode.Overwrite
    case "append" => SaveMode.Append
    case "ignore" => SaveMode.Ignore
    case "error" | "errorifexists" | "default" => SaveMode.ErrorIfExists
    case _ => throw new IllegalArgumentException(s"Unknown save mode: $saveMode. " +
      "Accepted save modes are 'overwrite', 'append', 'ignore', 'error', 'errorifexists'.")
  }
  this
}
//mode的Ignore属性注释
/**
 * Ignore mode means that when saving a DataFrame to a data source, if data already exists,
 * the save operation is expected to not save the contents of the DataFrame and to not
 * change the existing data.
 *
 * @since 1.3.0
 */

2.将DataFrame保存为text:
注意:将DataFrame保存为text格式,只能保存一列,且数据类型只能为String

// DataFrame保存成text
 reslut.write.text("/Users/text")

3.保存为json和csv格式

reslut.write.json("/Users/zx/Desktop/json")
reslut.write.csv("/Users/zx/Desktop/csv")

4.将数据保存为parquet格式

reslut.write.parquet("hdfs://node-4:9000/parquet")

2.csv

csv文件格式是以逗号分隔,通过Sparksession读取数据转换为DataFrame数据结构

val spark = SparkSession.builder().appName("CsvDataSource")
  .master("local[*]")
  .getOrCreate()
//指定以后读取json类型的数据
val csv: DataFrame = spark.read.csv("/Users/csv")
csv.printSchema()
val pdf: DataFrame = csv.toDF("id", "name", "age")
.....
pdf.show()
spark.stop()

3.Json

也是通过SparkSql的api读取数据,将json数据格式转换为DataFrame格式,其中Json的Key为表头。

val spark = SparkSession.builder().appName("JdbcDataSource")
  .master("local[*]")
  .getOrCreate()
import spark.implicits._
//指定以后读取json类型的数据(有表头)
val jsons: DataFrame = spark.read.json("/Users/json")
val filtered: DataFrame = jsons.where($"age" <=500)
filtered.printSchema()
filtered.show()
spark.stop()

4.parquet

parquet文件是列式存储格式的,不仅保存了数据,还保存了元数据信息(包含列的名字/类型/是否可以为空等)

val spark = SparkSession.builder().appName("ParquetDataSource")
  .master("local[*]")
  .getOrCreate()

//指定以后读取json类型的数据
val parquetLine: DataFrame = spark.read.parquet("/Users/zx/Desktop/parquet")
parquetLine.printSchema()
parquetLine.show()
spark.stop()

5.Hive

注意点:
1.如果想让hive运行在spark上,一定要开启spark对hive的支持

.enableHiveSupport()

2.想要使用hive的元数据库,必须指定hive元数据的位置,添加一个hive-site.xml到当前程序的classpath(Resources)下即可
3.要在/etc/profile中配置一个环节变量(让sparkSQL知道hdfs在哪里,其实就是namenode在哪里)
exprot HADOOP_CONF_DIR(如果在IDEA中编写程序,需要将Hadoop配置文件中的core-site和hdfs-site文件加入resources目录下,让sparksql知道那个是Data/NameNode)
4.将Hive配置文件中的hive-site.xml加入到Spark的conf中
5.需要上传一个jdbc连接包到Spark的lib中

//如果想让hive运行在spark上,一定要开启spark对hive的支持
val spark = SparkSession.builder()
  .appName("HiveOnSpark")
  .master("local[*]")
  .enableHiveSupport()//启用spark对hive的支持(可以兼容hive的语法了)
  .getOrCreate()
//想要使用hive的元数据库,必须指定hive元数据的位置,添加一个hive-site.xml到当前程序的classpath下即可
//val result: DataFrame = spark.sql("SELECT * FROM t_boy ORDER BY fv DESC")
val sql: DataFrame = spark.sql("CREATE TABLE niu (id bigint, name string)")
sql.show()
//result.show()
spark.close()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值