Spark SQL将计算指标的特定的列转换为Json,其他列不变

1.实现效果前后对比

parquet文件链接:https://pan.baidu.com/s/1dmugj-ty47Hgi6WLAPaiGQ?pwd=yyds
提取码:yyds
--来自百度网盘超级会员V2的分享

          原表格(spark自带的parquet文件)user.parquet
namefavorite_colorfavorite_numbers
Alyssanull[3, 9, 15, 20]
 Ben red  [  ]

======>转换后

          实现name,favorite_color转json的表格
  Newcol    favorite_numbers
{“name”: “Alyssa”,”favorite_color”: “null”}[3, 9, 15, 20]
{“name”: “ Ben”,”favorite_color”: “red”}  [  ]

2.代码附上

package com.sz.table_ddl.test

import org.apache.spark.SparkConf
import org.apache.spark.sql.{SaveMode, SparkSession}
import org.apache.spark.sql.functions.{struct, to_json}

object col_json {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new
        SparkConf().setMaster("local[*]").setAppName("SparkSQL")
    //1.todo 建立和spark框架的链接
    val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()

    //禁用广播
    spark.sql("set spark.sql.autoBroadcastJoinThreshold=-1")
    //2. todo 读取文件
    val string_quet=spark.read.format("parquet").load("D:\\a\\users.parquet")
    //创建虚拟表
    string_quet.createOrReplaceTempView("users")
    //显示parquet文件的数据
    string_quet.show(5)

    //3. todo 计算指标
    val rs=spark.sql(
      """
        |select
        |s.name as name,
        |s.favorite_color as color,
        |s.favorite_numbers as numbers
        |from users s
        |""".stripMargin)

    rs.show()
    //导包--> import org.apache.spark.sql.functions.{struct, to_json}
    val finalDF = rs.withColumn("Newcol", to_json(struct("color","numbers")))
    //一定要用sql得到列的别名
    //selectExpr查询指定列
    finalDF.selectExpr("Newcol","numbers").show(false)


/**
 =========================================
 下面的代码要自测,我就不注释掉了,从官网拿的
 =========================================
 **/
    
    //当然得到的结果也可以导入到mysql

    //1. todo mysql数据库建表
    // 建表中`numbers` enum,没有测过,思路是这样
    /**
    create table tab_json03 (
      `numbers` enum,
      `|Newcol` JSON
    )engine = InnoDB default charset = utf8mb4;

     **/
   //2. todo 导入数据到mysql
    finalDF.selectExpr("Newcol","numbers").write.format("jdbc")
      // todo option:jdbc里面的四大金刚 url,table,user,password
      .option("url", "jdbc:mysql://localhost:3306/names?&useUnicode=true&characterEncoding=utf8")
      .option("dbtable", "tab_json02")
      .option("user", "root")
      .option("password", "root")
      // todo 更新
      // .mode(SaveMode.Overwrite)
      // todo 追加
      .mode(SaveMode.Append)
      .save()

    /**
 =========================================
     这个代码自测,
 =========================================
     **/
    // todo 释放资源
    spark.stop()
  }
}

3.代码结果

参考:

Spark SQL指定特定的列转换为Json_呼呼的小窝-CSDN博客_spark sql 结果转为json

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spark编程,我们可以使用Spark SQL来将数据转换JSON格式并写入Hive。 首先,我们需要创建一个DataFrame,可以从Hive表读取数据或者通过其他方式创建。然后,我们可以使用`toJSON`函数将DataFrame数据转换JSON格式。这将返回一个新的DataFrame,其包含一个JSON(通常命名为“value”)。 接下来,我们可以将这个DataFrame写入Hive表。首先,我们需要将DataFrame注册为一个临时视图,以便能够执行SQL查询。可以通过`createOrReplaceTempView`函数来实现。然后,我们可以使用INSERT INTO语句将临时视图的数据插入到Hive表。 下面是一个示例代码: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Spark JSON to Hive") .enableHiveSupport() .getOrCreate() // 读取数据并创建DataFrame val data = spark.read.table("input_table") // 将数据转换JSON格式 val jsonString = data.toJSON // 将JSON数据写入Hive表 jsonString.createOrReplaceTempView("tempView") spark.sql("INSERT INTO TABLE output_table SELECT * FROM tempView") ``` 在以上代码,我们假设已经在Hive创建了`input_table`和`output_table`两个表。首先,我们使用`spark.read.table`函数读取`input_table`表的数据,并创建一个DataFrame。然后,我们使用`toJSON`函数将DataFrame数据转换JSON格式,并将结果保存到一个新的DataFrame。最后,我们通过将新的DataFrame注册为临时视图,然后使用INSERT INTO语句将临时视图的数据插入到Hive的`output_table`表。 总的来说,利用Spark的编程能力,我们可以轻松地将数据转换JSON格式,并将其写入Hive表。这为我们在Hive进行灵活的数据处理和分析提供了方便和高效的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别这么骄傲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值