gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档数据库

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 分类归档: "数据库"
mysql 1月 16,2025

如何在shell脚本使用 MySQL 命令行给 SQL 文件传参

在编写 Shell 脚本或进行命令行操作时,有时需要执行包含预定义 SQL 语句的文件,并且可能希望根据不同的情况向这些 SQL 文件传递参数。这在批量处理、自动化任务或动态生成查询时特别有用。MySQL 的命令行工具提供了执行 SQL 文件的能力,但直接从命令行传递参数到 SQL 文件的功能有限。因此,我们通常会结合使用文本处理工具如 sed 来实现这一点。

使用 sed 预处理 SQL 文件

sed 是一个流编辑器,可以在不打开文件的情况下对文件内容进行各种操作,比如替换文本、插入文本等。我们可以利用 sed 在执行 SQL 文件之前修改其中的占位符,将实际的参数值写入 SQL 文件中。下面是一个简单的例子:

假设有一个名为 insertstmt.sql 的 SQL 文件,其内容如下:

INSERT INTO test.demo_table VALUES(@name, @age);

这里 @name 和 @age 是我们需要从外部传递的参数。为了实现这一点,我们可以创建一个 Shell 脚本 execute.sh,它接受两个参数并用它们来替换 yoursql.sql 中的变量:

#!/bin/sh
# 设置参数作为 SQL 变量并添加到 yoursql.sql 文件的第一行
sed -i "1 i\ SET @name='$1';" yoursql.sql
sed -i "1 i\ SET @age=$2;" yoursql.sql

# 执行 SQL 脚本
mysql -u root < yoursql.sql

# 清除 SQL 脚本中的变量设置
sed -i '1,2d' yoursql.sql

在这个脚本中,$1 和 $2 分别对应于调用脚本时提供的第一个和第二个参数。当我们运行这个脚本,例如 ./execute.sh lenmom 30,它会先修改 yoursql.sql 文件,使其看起来像这样:

SET @name='lenmom';
SET @age=30;
INSERT INTO test.demo_table VALUES(@name, @age);

然后执行该 SQL 文件,最后恢复原始状态以供下次使用。

安全性与最佳实践

虽然上述方法可以很好地工作,但在实际应用中需要注意几个方面:

  • 安全性:当构建 SQL 查询字符串时,确保对外部输入进行了适当的转义,以防止 SQL 注入攻击。
  • 错误处理:考虑加入错误处理逻辑,以便在出现问题时能够及时通知用户。
  • 日志记录:记录每次操作的日志对于追踪问题和审计非常重要。
  • 备份机制:如果直接修改了 SQL 文件,在执行前最好先创建一个副本以防万一。

实际案例分析

让我们来看一个更复杂的实例,其中涉及到数据库连接信息以及多个参数的传递。想象一下,你有一个定期更新用户信息的任务,需要每天晚上更新一次特定用户的年龄信息。你可以创建一个名为 update_user_age.sh 的 Shell 脚本来完成这项任务:

#!/bin/bash
# 数据库连接信息
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="password"

# 用户名和新年龄作为参数传递
USER_NAME="$1"
NEW_AGE="$2"

# 更新 SQL 文件中的变量
sed -i "1 i\ USE my_database;" update_user_age.sql
sed -i "2 i\ UPDATE users SET age = $NEW_AGE WHERE username = '$USER_NAME';" update_user_age.sql

# 执行更新
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" < update_user_age.sql

# 恢复 SQL 文件
sed -i '1,2d' update_user_age.sql

此脚本首先指定了数据库连接的信息,接着接收用户名和新的年龄作为参数,并使用 sed 将这些参数插入到 update_user_age.sql 文件中。之后通过 MySQL 命令执行更新操作,最后清理临时添加的内容,保证 SQL 文件的干净。

作者 east
mysql 1月 16,2025

解决命令行mysql -e 执行长sql没结果

用
mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} ${DB_NAME} -e”${sql}” 方式来执行sql,发现执行没报错,但没有结果。而这个sql在navicat单独执行是没报错的,并且没有双引号等冲突。

在命令行中执行 SQL 时,如果 SQL 语句格式不正确,尤其是涉及到多行 SQL 语句或特殊字符时,命令行可能无法正确解析。可能的原因和解决办法:

  • 分隔符问题:如果 ${bigdata_charge_electric_hour} 包含多行或复杂的 SQL 语句,确保它是一个有效的单行语句。如果包含换行符或者特殊字符,命令行工具可能会解释错误。
  • 引号问题:如果 ${bigdata_charge_electric_hour} 中的 SQL 语句本身包含了引号(例如 ' 或 "),需要确保它们被正确转义,否则命令行会解析错误。可以使用双引号 " 来包装 SQL 查询,或者使用反斜杠转义其中的引号。

解决方法:如果 SQL 语句包含多行或者特殊字符,可以考虑将其写入一个 .sql 文件,并使用 mysql 命令执行文件:

mysql -h${HOST_NAME} -P${PORT} -u${USER_NAME} ${DB_NAME} < your_sql_file.sql 

这样可以避免命令行解析时的格式问题。

修改成上面的方式果然执行成功并且有结果了。

作者 east
Flink, tdengine 1月 3,2025

Flink读取TDEngine数据实例,解决com.taosdata.jdbc.rs.RestfulDatabaseMetaData@38af9828 is not serializable. The object probably contains or references non serializable fields错误

用flink读取TDEngine,运行报错:
com.taosdata.jdbc.rs.RestfulDatabaseMetaData@38af9828 is not serializable. The object probably contains or references non serializable fields

这意味着 com.taosdata.jdbc.rs.RestfulDatabaseMetaData 类的对象无法被序列化,而 Flink 的作业中涉及到的某些操作需要将对象传递到不同的任务中,这就要求对象是可序列化的(即实现了 Serializable 接口)。在 Flink 中,所有要在分布式环境中传输或持久化的对象都必须是可序列化的。

  • RestfulDatabaseMetaData 是 TDengine JDBC 驱动中的一个类,它可能没有实现 Serializable 接口,因此在需要将该类对象传输到其他机器时,Flink 无法进行序列化。

解决方法是

使用 transient 关键字避免对不可序列化对象进行传递。

通过标记 connection、preparedStatement 和 resultSet 为 transient,这些对象不会被 Flink 传递到 Task Manager。

完整可执行代码如下:


import org.apache.flink.streaming.api.functions.source.RichParallelSourceFunction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TDengineSourceFunction extends RichParallelSourceFunction<RunData> {

    private transient Connection connection;        // 使用 transient 避免序列化
    private transient PreparedStatement preparedStatement;
    private transient ResultSet resultSet;
    private String query;
    private volatile boolean isRunning = true;

    private String jdbcUrl;
    private String user;

    private String password;


    public TDengineSourceFunction(String jdbcUrl, String user, String password, String query) {
        this.query = query;
        this.jdbcUrl = jdbcUrl;
        this.user = user;
        this.password = password;

        // JDBC连接参数在open()方法中初始化
    }

    @Override
    public void open(org.apache.flink.configuration.Configuration parameters) throws Exception {
        super.open(parameters);
        Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
        // 在这里初始化数据库连接
        this.connection = DriverManager.getConnection(jdbcUrl, user, password);
        // 准备SQL查询语句
        this.preparedStatement = connection.prepareStatement(query);
        this.resultSet = preparedStatement.executeQuery();
    }

    @Override
    public void run(SourceContext<RunData> sourceContext) throws Exception {
        while (isRunning && resultSet.next()) {
            // 从ResultSet中提取数据并转换为RunData对象
            RunData data = convertResultSetToData(resultSet);
            // 将数据发送到Flink的处理流中
            if (data != null) {
                sourceContext.collect(data);
            }
        }
    }

    @Override
    public void cancel() {
        isRunning = false;
        // 关闭资源
        try {
            if (resultSet != null) resultSet.close();
            if (preparedStatement != null) preparedStatement.close();
            if (connection != null) connection.close();
        } catch (SQLException e) {
            // 处理关闭资源时的异常
            e.printStackTrace();
        }
    }

    private RunData convertResultSetToData(ResultSet resultSet) throws SQLException {
        // 提取单行数据
      
        // 将数据转换为 RunData 对象


      //  return new RunData(......);
        return null;
    }
}
作者 east
tdengine 12月 12,2024

TDEngine 删除数据解决”The DELETE statement must have a definite time window range”

用DBeaver生成Delete语句

DELETE FROM iotdb.car
WHERE ts = ‘2024-08-31 07:21:14.000’ AND val = 200.0

执行后报错:The DELETE statement must have a definite time window range

以为是要加时间范围。修改成

DELETE FROM iotdb.car
WHERE ts > ‘2024-08-31 07:21:13.000’ AND
ts > ‘2024-08-31 07:21:14.000 AND val = 200.0

还是报同样的错误,以为是时间范围太大还是太小,进行各种修改时间范围还是报错依旧。

看了官方文档说明:

0x80002655The DELETE statement must have a definite time window rangeDELETE语句中存在非法WHERE条件检查并修正SQL语句

结果官方示例,修改为:

DELETE FROM iotdb.car
WHERE ts = ‘2024-08-31 07:21:14.000’

果然执行成功了。TDEngine还是有些和Mysql有些不同,现在用的
DBeaver 进行删除行也是报错,用DBeaver生成的sql有时是存在问题。还是要结合官方文档进行判断。

作者 east
mysql, 海豚调度器 9月 18,2024

解决Sqoop从mysql导出数据到hive结果为空时的报错

在海豚调度器1.3.5,用Sqoop从hive导入数据到mysql,有时由于计算结果为空,导致hive的表当天分区的数据为空,Sqoop导出到mysql时报错。海豚调度器设置了失败继续策略也没用,导致后面的工作流没办法继续执行下去。

可以在执行sqoop之前增加判断当天分区的数量是否为空,如果为空就不执行导出。

# 检查分区是否为空
empty=$(hive -S -e "SELECT COUNT(*) FROM cnsaas.ads_bigdata_iot_data WHERE dt='$yesday_date';" | awk '{print $1}')

if [ "$empty" -eq 0 ]; then
  echo "分区为空,不执行 Sqoop 导出。"
else
  echo "分区非空,执行 Sqoop 导出。"

完整的sqoop脚本如下:

#!/bin/bash

# 定义变量
host="your_host"
user="your_user"
pwd="your_password"
yesday_date=$(date -d "yesterday" +%Y-%m-%d)

# 检查分区是否为空
empty=$(hive -S -e "SELECT COUNT(*) FROM cnsaas.ads_bigdata_iot_data WHERE dt='$yesday_date';" | awk '{print $1}')

if [ "$empty" -eq 0 ]; then
  echo "分区为空,不执行 Sqoop 导出。"
else
  echo "分区非空,执行 Sqoop 导出。"
  sqoop export \
    --connect jdbc:mysql://$host:3306/zgcn?characterEncoding=UTF-8 \
    --username $user \
    --password $pwd \
    -m 1 \
    --table ads_bigdata_iot_data\
    --columns stat_date,data_type,stat_type,cu_pid_system_code,max_value,min_value,avg_value \
    --fields-terminated-by '\001' \
    --update-key stat_date,data_type,stat_type,cu_pid_system_code \
    --update-mode allowinsert \
    --input-null-string '\\N' \
    --input-null-non-string '\\N' \
    --null-string '\\N' --null-non-string '\\N' \
    --export-dir /user/hive/warehouse/cnsaas.db/ads_bigdata_iot_data/dt=$yesday_date/*
fi
作者 east
tdengine 9月 12,2024

tdengine存放的数据是类似mysql那样吗

TDengine 存放的数据并不完全类似于 MySQL。虽然两者都是数据库管理系统,但它们的设计目标、数据组织方式和存储结构有着本质的不同。

数据组织方式:

  • TDengine:它专为处理时序数据设计,因此其数据组织方式也充分考虑到了这一点。TDengine 将每一个采集点的数据作为数据库中的一张独立的表来存储,这种设计使得对于特定采集点的数据,无论是内存还是硬盘上的数据点都可以被快速访问 1。此外,TDengine 还引入了超级表(Super Table)的概念,允许用户定义一组具有相同模式(schema)的表,从而简化数据管理和查询。
  • MySQL:作为一个通用的关系型数据库,MySQL 主要处理的是关系型数据,即数据之间的关系可以通过外键等机制建立起来。MySQL 中的数据组织通常是基于表的,表与表之间通过关联关系进行链接,形成复杂的数据模型。

数据存储结构:

  • TDengine:采用了列式存储的方式,这有助于提高压缩和查询效率。TDengine 还引入了虚拟数据节点(vnode)的概念,每个 vnode 负责为采集的时序数据提供写入、查询和计算的功能,同时便于负载均衡、数据恢复和支持异构环境 10。存储的数据包括时序数据以及库、表相关的元数据、标签数据等,这些数据具体分为时序数据,存放于 vnode 里,由 data、head 和 last 三个文件组成 4。
  • MySQL:则主要基于行存储,尽管 MySQL 的 InnoDB 引擎也支持行级锁定和某些形式的数据压缩,但它的设计初衷是为了支持事务处理和复杂的 SQL 查询,因此在数据存储上更注重事务的一致性和隔离性。

性能比较:

  • 写入性能:TDengine 相对于 MySQL 在写入性能方面表现出显著的优势,尤其在处理大规模数据集时,TDengine 可以通过简单调整虚拟节点数量的方式来获得更高的写入性能,并且针对大数据集写入场景展现出了更大的性能优势 2。在一些性能测试中,TDengine 的插入速度远远超过了 MySQL,尤其是在并发写入时表现更佳 7。
作者 east
tdengine 9月 12,2024

TDengine 和 MySQL 在数据查询方面有哪些区别?

TDengine 和 MySQL 在数据查询方面的区别主要体现在以下几个方面:

查询性能

  • TDengine:由于专为时序数据设计,TDengine 在处理时序数据查询时通常会有更好的性能。它采用了列式存储和数据压缩技术,这使得在查询大量时间序列数据时能够更快地从磁盘加载数据,并且减少了数据传输的带宽需求。此外,TDengine 的查询优化器可能会针对时序数据的特点进行专门的优化,例如对时间范围的快速定位和过滤。
  • MySQL:虽然 MySQL 也可以处理时序数据,但由于它是为通用关系型数据设计的,所以在处理大规模时间序列数据时可能不如 TDengine 高效。MySQL 的查询优化器通常需要处理更多的索引和复杂的 SQL 语句,这可能会导致在大规模数据集上的查询性能下降。

查询语言

  • TDengine:使用一种简单的 SQL-like 查询语言,但它针对时序数据做了特定的扩展,支持一些特殊的函数,如聚合函数,这些函数特别适合处理时间序列数据。例如,它可以很容易地实现时间窗口内的数据聚合、滑动窗口计算等功能。
  • MySQL:使用标准的 SQL 查询语言,支持丰富的查询功能,包括复杂的连接操作、子查询、事务处理等。MySQL 的查询语言更加通用,可以处理各种类型的数据和查询需求。

扩展性和并行处理

  • TDengine:设计了分布式架构,可以在多个节点上水平扩展,利用多核 CPU 并行处理查询请求。这意味着 TDengine 在大规模数据集上的查询可以利用集群中的多台机器来加速查询响应时间。
  • MySQL:虽然 MySQL 也有分布式和集群解决方案(如 MySQL Cluster),但在默认情况下,它并不是为大规模分布式查询设计的。MySQL 的扩展性更多依赖于主从复制、分片(Sharding)等技术。

数据模型

  • TDengine:支持超级表(Super Table)的概念,这是一种用来存储大量具有相同模式(schema)的表的方法,这使得对相似数据的查询变得非常高效。超级表可以帮助简化数据管理和查询,特别是在 IoT 场景下,很多设备产生的数据格式是一致的。
  • MySQL:支持传统的表和视图模型,数据查询通常需要明确指定表名和字段,对于具有相同模式的数据,MySQL 可能需要多个表来表示,这增加了查询的复杂性。

特定功能

  • TDengine:提供了针对时序数据的一些特定功能,如自动数据过期处理、数据压缩、实时数据分析等。这些功能使得 TDengine 在处理时间序列数据时更加得心应手。
  • MySQL:虽然也可以通过插件或者第三方工具来增强其处理时序数据的能力,但它并不是专门为这些功能设计的。

总的来说,TDengine 和 MySQL 在数据查询方面的设计目标和服务场景不同。TDengine 以其高效的时序数据处理能力,在物联网、监控系统等领域有较好的表现;而 MySQL 则因其通用性和广泛的适用性,在各种数据库应用中都有很好的表现。选择哪种数据库取决于具体的应用需求和数据特性。

作者 east
mysql 8月 14,2024

用update来把mysql 2个字段交换数据的注意事项

需要把mysql的2个字段交换数据,刚开始想能不能在同一张表中交换数据,例如:

UPDATE tb_test
SET 
    discharge_energy_start = charge_energy_start,
    discharge_energy_end = charge_energy_end,
    charge_energy_start = discharge_energy_start,
    charge_energy_end = discharge_energy_end;

执行后,发现discharge_energy_start 、discharge_energy_end 数据变了,但charge_energy_start 、charge_energy_end 不是自己想要的数据,原来mysql执行是有分先后顺序的,不会缓存一个中间表来进行数据交换。

这时可以先复制tb_test的表到tb_test_copy1,读取 tb_test1 的数据来更新
tb_test ,就可以达到字段交换数值。

UPDATE tb_test AS dest
JOIN tb_test_copy1 AS src
    ON dest.day = src.day
    AND dest.pid_system_code = src.pid_system_code
SET 
    dest.discharge_energy_start = src.charge_energy_start,
    dest.discharge_energy_end = src.charge_energy_end,
    dest.charge_energy_start = src.discharge_energy_start,
    dest.charge_energy_end = src.discharge_energy_end
WHERE dest.day = '2024-08-08'
  AND dest.pid_system_code REGEXP '^1048\\.E[0-9]+\\.S[0-9]+\\.IEM$';
作者 east
mysql 7月 15,2024

mysql使用 docker-compose 方式部署时区不是东八区的解决方案

mysql使用docker-compose安装后,发现时区不是东八区,导致一些服务有些出现问题。

查询时区:

SHOW VARIABLES LIKE ‘%time_zone%’;

MySQL 使用的是 UTC 时区,而不是东八区(CST)。在 Docker 容器中运行的 MySQL 实例也会使用 UTC 时区。要解决这个问题,您需要在 MySQL 配置文件中设置时区为东八区。

解决方案:

修改 my.cnf 配置文件,添加以下行以设置时区为东八区(CST):在 [mysqld] 部分添加:

default-time_zone = '+08:00'

mysql库 /opt/mysql-master/conf/my.cnf 

示例:

[mysqld]

...

default-time_zone = '+08:00'

重新启动 MySQL 容器以应用更改。

docker-compose -f /opt/mysql-master/docker-compose.yml down docker-compose -f /opt/mysql-master/docker-compose.yml up -d

现在,您的 MySQL 实例应该已经使用东八区(CST)时区了。您可以通过登录到 MySQL 并运行以下命令来验证时区设置:

SHOW VARIABLES LIKE 'time_zone';

输出应显示 time_zone 为 +08:00。

作者 east
mysql, 运维 6月 27,2024

centos离线安装mysql客户端(亲测可用)

由于项目的需要,需要在内网的centos服务器,有mysql客户端远程访问mysql服务器。

1. 下载MySQL客户端

首先,你需要下载MySQL客户端软件包。你可以从MySQL官方网站下载,或者使用CentOS的软件仓库。

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar

2. 安装MySQL客户端

解压缩下载的文件,并安装RPM包:

tar xvf mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-client-5.7.34-1.el7.x86_64.rpm

用命令 which mysql 看到下面结果时说明安装成功了:

/usr/bin/mysql

3. 连接到远程MySQL服务器

使用以下命令连接到远程MySQL服务器:

mysql -u your_username -p -h remote_server_ip

注意事项:

  • 确保远程MySQL服务器允许来自你的CentOS服务器的连接。你可能需要在远程服务器的MySQL配置文件(通常是my.cnf)中设置bind-address为0.0.0.0,并在mysql.user表中授予远程访问权限。
  • 确保防火墙规则允许两个服务器之间的3306端口(MySQL默认端口)的流量。
  • 如果你使用的是较新或较旧的MySQL版本,请下载相应的安装包。
作者 east
mysql, Spark 6月 14,2024

PySpark清空mysql的表数据代码(亲测可用)

用PySpark来数据分析和数据仓库操作时,有时需要先清空mysql数据再写入数据。但是pyspark不能直接执行DDL(数据定义语言)操作如TRUNCATE TABLE,这时一种方法是用第三方库,利用 TRUNCATE TABLE 等方法来操作,另外还有一种变通的方法:

直接使用插入空数据的方式来“清空”表并不是传统意义上的清空(truncate或delete操作),但如果你想通过Pyspark实现类似效果,可以考虑先创建一个空的DataFrame,然后覆盖写入到目标表中。这种方式实际上是执行了一个覆盖写入操作,会删除原表数据并用新的空数据集替换。请注意,这种方法会依赖于你的MySQL配置是否允许覆盖写入操作,且在大量数据情况下效率较低。

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType

def clear_table_with_pyspark(table_name):
    try:
        # 初始化SparkSession
        spark = SparkSession.builder.getOrCreate()

        # 定义空DataFrame的架构,这里只是一个示例,根据你的表实际结构来定义
        schema = StructType([
            StructField("column1", StringType(), True),  # 更改为你表中的实际列名和类型
            StructField("column2", StringType(), True),  # 可以根据需要添加更多列
            # ...
        ])

        # 创建一个空的DataFrame
        empty_df = spark.createDataFrame(spark.sparkContext.emptyRDD(), schema)

        # JDBC连接字符串
        url = "jdbc:mysql://{host}:{port}/{database}".format(
            host=DB_HOST,
            port=str(DB_PORT),
            database=DB_NAME
        )

        # 使用覆盖写入模式(overwrite)将空DataFrame写入到表中
        empty_df.write \
            .format("jdbc") \
            .option("url", url) \
            .option("dbtable", table_name) \
            .option("user", DB_USER) \
            .option("password", DB_PASSWORD) \
            .option("driver", "com.mysql.jdbc.Driver") \
            .mode("overwrite") \
            .save()

        print(f"Table {table_name} has been emptied using Spark write operation.")
    except Exception as e:
        print(f"Error occurred while clearing table {table_name}: {e}")
        if hasattr(e, 'java_exception'):
            java_exception = e.java_exception
            print("Java exception details:", java_exception)
            print("Java exception message:", java_exception.getMessage())
            print("Java exception stack trace:", java_exception.getStackTrace())

# 调用函数
clear_table_with_pyspark("your_table_name")

请注意,这种方法的一个重要限制是它要求你明确地定义目标表的结构,这可能在表结构复杂或频繁变动时变得不够灵活。此外,对于非常大的表,尽管它能达到“清空”的目的,但效率和资源消耗可能不如直接使用TRUNCATE或DELETE语句。

作者 east
mysql, 大数据开发 10月 12,2023

sql聚合函数嵌套问题 aggregate function cannot contain aggregate parameters

在需求的应用场景,需要对create_time字段求最小值并求和,刚开始理所当然写成像下面这样:

 SUM(COALESCE (CASE WHEN MIN(crl.create_time)  BETWEEN date_add(date_sub(current_date(), 1), -1 * (open_case_day_num % 6)) AND current_date() AND  crl.approval_status in('0','1') and crl.del_flag = '0' THEN  CAST(crl.repay_total AS DECIMAL(10, 2)) END,0))

SUM聚合函数又嵌套MIN函数,果然报错了:
1105 – errCode = 2, detailMessage = aggregate function cannot contain aggregate parameters

这是因为 根据错误日志,问题出在了对于SUM函数中的聚合参数的使用上。在Spark SQL中,聚合函数不能包含聚合参数,也就是不允许在聚合函数内部再使用其他聚合函数。

解决方案是可以先使用子查询,将MIN(create_time)计算结果作为一个新的列,然后在外层查询中对这个新列和其他列进行求和,如下所示:

SELECT SUM(amount), SUM(min_create_time)
FROM (
  SELECT amount, MIN(create_time) AS min_create_time
  FROM your_table
  GROUP BY amount
) t;

其中,我们首先在子查询中计算每个amount的最小create_time,并将结果存储在名为min_create_time的新列中。然后,在外部查询中,我们对amount列和min_create_time列同时进行汇总。

需要注意的是,在子查询中,我们只能按照amount列进行分组,否则会导致结果不正确。如果还有其他需要汇总的列,则需要在子查询中一并处理。

关注公众号“大模型全栈程序员”回复“大数据面试”获取800页左右大数据面试宝典 ,回复“大数据”获取多本大数据电子书

作者 east

1 2 3 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.