如何像我们在 hive 中那样为每个 id 分区 MySQL 表

Posted

技术标签:

【中文标题】如何像我们在 hive 中那样为每个 id 分区 MySQL 表【英文标题】:How to partition MySQL table for every id just like we do in hive 【发布时间】:2021-10-18 10:00:47 【问题描述】:

在我们的应用程序中,我们为每个查询构建一个唯一的查询 id,并根据该查询 id 插入到表中。 我们曾经为此使用 Hive,这很容易;

create table hivetable (
...
)PARTITIONED BY ( query_id INT ) ...

插入表格是这样的:

alter table hivetable add partition (query_id=?);
insert into hivetable  partition(query_id=?) select ...;

现在我们正在迁移到 mysql,我很困惑。我尝试了下表并像这样插入:

create table mytable (...)  PARTITION BY HASH(query_id);

insert into mysql values(?,?,...,<query_id>);

显然它没有按我想要的方式工作。它将所有 query_id 的数据插入到一个分区中。 所以我真的很感激一些帮助 谢谢

【问题讨论】:

我怀疑您是否需要在 MySQL 中进行分区。可以发一下原因吗? 您好,首先谢谢。除了插入之外,我们还为 query_id 选择并删除这些记录。所以我们需要这些操作高速运行。 如果是这样,请考虑 RANGE 分区,而不是 HASH。 没有任何好处,只是为此使用分区的复杂性。 【参考方案1】:

最后,索引对我来说效果很好。我们想使用 Hive 分区之类的东西,因为要固定选择、删除操作。我发现 MySQL 中的索引非常符合我们的需求。如果你索引你使用 where 语句的列,它会很好地加快你的查询。您可以在以下链接中找到更多信息:https://dev.mysql.com/doc/refman/8.0/en/create-index.html

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

这里是关于如何使用Mysql Partitions 的文档。这是一个使用哈希的例子。

警告如果不包含 PARTITIONS 子句,则分区数默认为 1。

    CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;

【讨论】:

【参考方案3】:

不要使用 MySQL 的 PARTITIONing 来执行此任务。只需将唯一的query_id 设为PRIMARY KEY。然后INSERT tblUPDATE tblSELECT ... FROM tbl,视情况而定。

【讨论】:

以上是关于如何像我们在 hive 中那样为每个 id 分区 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章

Hive动态分区

Hive 分区、分桶和排序表 - 多个插入

如何在 Hive 中为批处理数据创建分层分区

Mysql 上亿级数据导入Hive思路分享

Hive Metastore 分区,它是如何工作的?

如何与 partitionBy 或 InsertInto Hive 并行保存 Dataframe/Dataset 的每个分区