我们将在课堂上介绍快速排序(使用数组)。我一直在尝试解决他们希望我们的快速排序作业如何与“三中位数”枢轴选择方法配合使用的问题。我只需要一个关于这一切如何运作的高级解释。我们的文字没有帮助,我很难在谷歌上找到清晰的解释。
这是我认为到目前为止所理解的:
index 0“三的中位数”函数采用(first)、array_end_index(last) 和(index 0 + array_end_index)/2(middle)中的元素。计算这 3 个指标的中值的指数。返回对应的索引。
功能参数如下:
/* @param left
* the left boundary for the subarray from which to find a pivot
* @param right
* the right boundary for the subarray from which to find a pivot
* @return
* the index of the pivot (middle index); -1 if provided with invalid input
*/
int QS::medianOfThree(int left, int right){}
Run Code Online (Sandbox Code Playgroud)
然后,在“partition”函数中,索引与“median of Three”函数返回的数字相匹配的数字作为主元。我的作业指出,为了继续对数组进行分区,枢轴必须位于左右边界之间。问题是,我们的“三个中位数”函数返回三个索引之一:第一个、中间或最后一个索引。这三个索引中只有一个(中间)可以是任何东西的“中间”。
功能参数如下:
/* @param left
* …Run Code Online (Sandbox Code Playgroud) 我有一个按年、月和日期分区的原始表。例如:
col_1 col_2 col_3 YEAR MONTH DATE
a b c 2017 03 25
Run Code Online (Sandbox Code Playgroud)
我想创建一个新表,它是该表的子集,但仍保留原始表的分区。
就像简单的事情
CREATE new_table AS
SELECT *
FROM original_table
WHERE (conditions);
Run Code Online (Sandbox Code Playgroud)
但是,由于原始表太大,我必须通过分区迭代此查询。
我当前的解决方案是编写一个 shell 脚本,迭代所有分区并为每个分区运行单独的查询。
例子:
for year in '2016' '2017'
do
for month in '01' '02' ...
do
for day in '01' '02' ...
do
hive -e "INSERT INTO new_table SELECT * FROM original_table WHERE YEAR=$year AND MONTH=$month etc."
done
done
done
Run Code Online (Sandbox Code Playgroud)
但这显得非常迂回且低效。有没有办法直接在配置单元中将其作为一行来执行此操作?
我有多个用于业务数据的大表,最小的一个有 3800 万行(24G 数据,26G 索引大小)。我设置了索引来加快查找速度,并将缓冲池设置为总 RAM(116G) 的 80%。即使在这些设置之后,随着时间的推移,我们也开始观察到性能问题。我对磁盘大小(1T)有限制,并且目前无法选择分片。数据增长已增至每天 50 万行。这导致频繁的优化和主开关练习。表模式和索引已经被优化。因此,我开始考虑对表进行分区以提高性能。我的主要分区用例是通过删除分区每月删除数据,这样就不需要优化并改善读/写延迟。以下是其中一个大表的结构(由于法律原因列名已更改 - 假设定义索引的列具有查找用例):
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data_1` int(11) NOT NULL,
`data_2` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`data_3` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`data_4` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_data1` (`data_1`),
KEY `index_data2` (`data_2`)
) ENGINE=InnoDB AUTO_INCREMENT=100572 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
我计划在created_at列上进行分区。然而,问题是分区列必须是所有唯一键的一部分。我可以将created_at列添加到主键,但这会导致索引大小增加,这反过来又会产生副作用。有没有一些解决方法或更好的解决方案?
除了解决这个问题之外,还有一些问题在现有的任何文档或文章中都找不到答案。1.为什么mysql保证分区列是唯一键的一部分?2. 来自 ORM 的查询不存在 create_at 子句,这意味着我们无法对读取进行修剪,但只要插入始终被修剪,我们就可以接受。然而,看起来情况并非如此。为什么mysql要打开所有分区进行插入?
Mysql 版本 - 5.6.33-79.0-log Percona Server (GPL),版本 …
我正在 Databricks 中创建一个增量表,其中包含 1 天的代理日志(数百行数百万行)。我希望能够按小时对表进行分区,因此简单地按“_time”列对表进行分区是不够的。另外,我正在使用%sql运行时在笔记本中创建表,但如果这是更好的选择,我愿意在 Scala 中创建它。
如何创建分区逻辑,以便为每个小时的日志创建一个新分区?
我的专栏的格式_time如下。
yyyy-mm-ddThh:mm:ss.xxxxxx-time:zone其中时间和区域是 2 位数字。
因此,我想对每个独特的小时进行分区,一天有 24 个分区,就像这样。
yyyy-mm-ddThh
我正在运行全新安装的 CentOS 7.7。在我的 Raspberry Pi 3 上,不幸的是,在安装 yum 软件包时,我的空间不足:
[root@centos7 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.4G 1.3G 104M 93% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 464M 0 464M 0% /dev/shm
tmpfs 464M 12M 452M 3% /run
tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/mmcblk0p1 286M 57M 230M 20% /boot
tmpfs 93M 0 93M 0% /run/user/0
Run Code Online (Sandbox Code Playgroud)
操作系统安装在16GB SD卡上,所以原则上我应该有足够的空间:
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 8192 593919 292864 c W95 FAT32 (LBA) …Run Code Online (Sandbox Code Playgroud) 我试图了解 Redis 流如何进行分区,如果可以将特定消息发送到特定分区(类似于使用 Kafka 的方式)。
我检查了redis-cli api,没有任何类似于分区的内容,在使用StackExchangeRedisredis库时也没有类似的内容。
唯一的方法是:IDatabase.StreamAdd(key,streamKey,streamValue,messageId)
我错过了什么吗?分区是否仅以固定方式进行?
PS 如果可以分区,分区键可以组合吗?
鉴于PostgreSQL 9.0.3下面的表分区:
CREATE TABLE records (
ts TIMESTAMP,
...
);
CREATE TABLE records_2010 (
CHECK (ts >= '2010-01-01 00:00:00' AND ts < '2011-01-01 00:00:00')
) INHERITS (records);
CREATE TABLE records_2011 (
CHECK (ts >= '2011-01-01 00:00:00' AND ts < '2012-01-01 00:00:00')
) INHERITS (records);
Run Code Online (Sandbox Code Playgroud)
我希望以下SELECT查询具有相同的EXPLAINed计划,仅查询"records"和"records_2011",但它们有所不同:
BEGIN;
-- Assume CURRENT_TIMESTAMP is 9 a.m. on 5 March 2011
SELECT * FROM records WHERE ts >= '2011-03-05 09:00:00'; -- scans 2 tables
SELECT * FROM records WHERE ts >= CURRENT_TIMESTAMP; -- scans all …Run Code Online (Sandbox Code Playgroud) 如何将列表L(或任何其他集合)拆分为2个列表,以便第一个包含80%,L第二个包含其余列表?
我试图在我的数据库表的MySQL数据库表模式上添加分区为
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_group_id` tinyint(3) unsigned NOT NULL DEFAULT '2',
`username` varchar(50) NOT NULL,
`email` varchar(80) NOT NULL,
`password` varchar(50) NOT NULL,
`first_name` varchar(25) DEFAULT NULL,
`last_name` varchar(25) DEFAULT NULL,
`gender` enum('m','f','u') NOT NULL DEFAULT 'u' COMMENT 'm=>Male, f=>Female, u=>Unspecified',
`profile_image` varchar(255) DEFAULT NULL,
`reset_key` varchar(50) DEFAULT NULL,
`block` enum('y','n') NOT NULL DEFAULT 'n' COMMENT 'y=>blocked, n=>notblocked',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP, …Run Code Online (Sandbox Code Playgroud) 我正在观看:https: //academy.datastax.com/courses/learning-cassandra-read-path/understanding-partition-summaries-and-indexes 我对此演示文稿有疑问.
分区摘要代表什么?:)
我的第一个想法是它只是一个缓存,保持x%的键位置.这意味着大约一个126的请求可以直接获得一个密钥而其他125个必须遍历整个表.但我认为这是非常无效的.
我的第二个想法是,分区摘要以某种方式能够为指定的键提供一系列索引,其中应存在给定键的行.但我无法想象这是如何实现的?特别是如果这个表应该是大小|分区索引|/index_interval
我想到的另一个问题是,SSTable可以为特定密钥保留许多条目吗?
谢谢,krzychusan
partitioning ×10
sql ×3
mysql ×2
c++ ×1
cassandra ×1
centos7 ×1
collections ×1
database ×1
databricks ×1
delta-lake ×1
hadoop ×1
hdfs ×1
hive ×1
indexing ×1
linux ×1
list ×1
nosql ×1
postgresql ×1
quicksort ×1
redis ×1
scala ×1
timestamp ×1