首页 > 数据库 >CDP7环境下使用SparkSQL Shell方式

CDP7环境下使用SparkSQL Shell方式

时间:2023-07-30 13:00:35浏览次数:46  
标签:Shell ++ hive echo SparkSQL CDP7 sql spark sparksql

相信很多在用CDP7的小伙伴都遇到了Spark里面不再支持spark-sql的问题

这里给出两种解决方案:spark-submit与spark-shell

cloudera官方给的解决方案

https://docs.cloudera.com/cdp-private-cloud-base/7.1.5/developing-spark-applications/topics/spark-sql-example.html

基于这个方案,这里提供两种通用方案

test.hql

CREATE DATABASE SPARK;
CREATE TABLE SPARK.TEST(ID INT, NAME STRING);
INSERT INTO SPARK.TEST VALUES(1,'Daniel');
SELECT
 * 
 FROM SPARK.TEST;
  • spark-submit(推荐)
    编写Scala代码来解决这个问题,这里以读取HDFS上的SQL为例
package sparksql

import org.apache.spark.sql.{Encoders, SparkSession}

import scala.collection.JavaConversions._

/**
  * @Author Daniel
  * @Description Spark运行HDFS上的SQL
  **/
object RunSparkSQL {
  def main(args: Array[String]): Unit = {
    if (args == null || args.length < 1) {
      println(
        """
          |parameter errors! Usage: <SQL>
          |SQL: a spark sql command
        """.stripMargin
      )
      System.exit(-1)
    }

    val spark = SparkSession.builder()
      // hive的配置
      .config("hive.metastore.uris", "thrift://hadoop03:9083")
      .appName(RunSparkSQL.getClass.getSimpleName)
      .enableHiveSupport()
      .getOrCreate()

    /*
    以spark.read的方式去读文本文件,会将文件读成一个表
    表的话,就涉及到很多列,但这里为SQL,是没有多列的,
    所以以一个不存在的分割符来切割,表示这里只需要一列
    !!!如果是低版本的Spark只支持一个分隔符,改为option("sep", "@")
     */
    val df = spark.read.option("sep", "@@@").csv(args(0))
    // 将df里面数据的格式强制转换为String类型,将其转成一个集合
    val rowList = df.as(Encoders.STRING).collectAsList
    var rows = ""
    // 添加空格,避免SQL连在一起产生语法错误
    for (row <- rowList) {
      rows += " " + row
    }
    // 如果有多个SQL,以分号来分割
    val sqlArr = rows.split(";")
    // 运行每一个SQL,注意这里要导入scala.collection.JavaConversions._才能进行遍历
    for (s <- sqlArr) {
      // 显示完整结果
      spark.sql(s).show(false)
    }
    spark.stop()
  }
}

将代码打成jar包,上传到hdfs

hdfs dfs -put test.hql /hive_data
hdfs dfs -put runsparksql.jar /hive_data/jars

然后编写Shell脚本

runspark.sh

spark-submit \
--class sparksql.RunSparkSQL \
--master local[*] \
--deploy-mode client \
--total-executor-cores 2 \
--executor-cores 1 \
--executor-memory 600M \
hdfs:///hive_data/jars/runsparksql.jar \
$1

运行脚本

bash runspark.sh hdfs:///hive_data/test.hql

结果

++
||
++
++

++
||
++
++

++
||
++
++

+---+------+
|ID |NAME  |
+---+------+
|1  |Daniel|
+---+------+

hive里面也可以查看

CDP7环境下使用SparkSQL Shell方式_spark

  • spark-shell
    编写shell脚本来解决这个问题,在spark的bin目录下新建脚本
vi $SPARK_HOME/bin/spark2-sql

spark2-sql

#!/bin/bash

if [[ $1 = "-e" ]];then
   sql=$2
elif [[ $1 = "-f" ]];then
   sql=`cat $2`
else
  echo "Usage:"
  echo "--------------------------------------------------------"
  echo "spark2-sql.sh -f [SQL filename] : execute a sql file"
  echo "spark2-sql.sh -e [SQL] : execute a sql"
  echo "--------------------------------------------------------"
fi

if [[ ${sql} =~ ';' ]];then
  i=1
  while((1==1))
  do
     splitchar=`echo $sql|cut -d ";" -f$i`
     if [ "$splitchar" != "" ];then
        ((i++))
        sparksql=${sparksql}"spark.sql(\"$splitchar\").show();"
     else
        break
     fi
  done
else
  sparksql = "spark.sql(\"$sql\").show();"
fi
echo $sparksql
echo ${sparksql} | spark-shell

直接运行即可,-e加具体sql,-f加文件(目前只支持Local的文件)

spark2-sql -e 'select current_timestamp;'
spark2-sql test.hql

CDP7环境下使用SparkSQL Shell方式_sql_02

标签:Shell,++,hive,echo,SparkSQL,CDP7,sql,spark,sparksql
From: https://blog.51cto.com/u_15294184/6899976

相关文章

  • FinalShell的使用及简介
    FinalShell简介FinalShell是一款国人开发的SSH客户端工具,多平台支持Windows,MacOSX,Linux。主要用于一体化服务器管理,软件支持shell和sftp同屏显示,并同步切换目录,不止如此,而且软件带有命令自动提示,让您的命令输入更加简单、便捷,另外,软件带有加速的功能,可以提高访问服务器的速度......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • ret2shellcode
    ret2shellcode介绍shellcode的意思其实就是能获取到shell的code,以前还疑惑为什么要交shellcode。解题1、先查看附件信息使用checksecret2shellcode可以查看到ret2shellcode的信息;发现是32位的小端序,某个段有着可读可写可执行的权限。Arch:i386-32-littleREL......
  • Day6: Shell函数和参数传递
    学习目标学习内容1.函数的定义和调用2.参数传递3.返回值4.练习任务大树哥个人信息学习目标学习Shell中函数的概念和用法。理解如何在函数中定义和调用命令序列。掌握如何传递参数给函数并获取返回值。练习编写脚本,使用函数进行模块化编程。学习内容今天我们将学习如......
  • Linux Shell脚本中的空格
    =等号两边必须无空格,否则报错;如:i=$1和i=$1都是错误的。但是在()内部不限制如for((i=1;i<3;i=i+1))(())内外括号之间无空格,写成(())这样会报错。但内部括号不限制如s=$(($i+1))[]是条件判断式,所以前后内部都必须有空格。其内部元素之间必须有空格才能识别,否则一律......
  • xshell连接liunx服务器身份验证不能选择password
    ssh用户身份验证不能选择password 只能用publickey的解决办法 问题现象使用密码通过Workbench或SSH方式(例如PuTTY、Xshell、SecureCRT等)远程登录ECS实例时,遇到服务器禁用了密码登录方式错误. 可能原因该问题是由于SSH服务对应配置文件/etc/ssh/sshd_config中的参数Pa......
  • FinalShell软件的下载
    1、FinalShell软件介绍FinalShell是一款免费的国产的集SSH工具、服务器管理、远程桌面加速的良心软件2、安装过程1、FinalShell下载地址:http://www.hostbuf.com/downloads/finalshell_install.exe下载完成之后,打开所在文件夹,然后双击进行下载:2、安装下载(路径一定要无中文、......
  • log4j2---基于vulhub的log4j2漏洞复现---反弹shell
    基于vulhub的log4j2漏洞复现---反弹shell1.方法一环境准备:和我上一篇fastjson1.2.24漏洞复现是一样的环境,方法也差别不大声明:遵纪守法,仅作学习记录用处,部分描述文字源于网络,若侵权联系删除老演员:centos8:192.168.59.135vulhub靶场win10:192.168.59.130攻击机......
  • windows下shellcode注入的例子(WriteProcessMemory+CreateRemoteThread)
    vs里x64编译如下代码:  #include<iostream>#include<Windows.h>//#include"common.h"intmain(){ //msfvenom-pwindows/x64/execCMD=notepad.exe-fc unsignedcharshellcode[]= "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x0......
  • 使用Go调用Powershell加域
    packagemainimport( "fmt" "github.com/go-ldap/ldap/v3" "github.com/mozillazg/go-pinyin" "os" "os/exec" "strings" "time")funcChineseToAbbreviation(chinesestring)string{......