小编Ami*_*min的帖子

用于查询优化的排序镶木地板文件

问题目的

对 parquet 文件进行排序有很多好处:

  • 使用文件元数据进行更有效的过滤
  • 更有效的压缩率

这样做可能还有其他好处。互联网上对此有很多讨论。正因为如此,这个问题的讨论并不是关于排序的原因。相反,这个问题的目的是谈论如何排序,这是在所有互联网链接中以最少解释(大约30%)提及的,而数据排序的挑战根本没有提及。这个问题的目的是希望得到该领域的专家和经验丰富的朋友的帮助,并确定最佳的排序方法(基于成本和收益)。

关于Apache parquet库的简要说明

在开始讨论 Spark 之前,我将解释一下用于生成 parquet 文件的工具。当我们创建 parquet 文件时,该parquet-mr库(例如我使用 Java,但它可能可以扩展到其他语言)会同时写入磁盘和内存。这个库还有一个功能叫做getDataSize()在磁盘上完全关闭后返回文件的准确最终大小,因此我们在写入parquet文件时可以使用它来实现以下两个条件:

  • 不要制作小尺寸的 parquet 文件(这对查询引擎不利)
  • 所有 parquet 文件都可以生成特定的最小大小或固定大小(例如,每个文件 1 GB)

由于这个库同时写入磁盘和内存,所以它不允许数据排序,除非所有数据先在内存中排序,然后交给库。(但这对于大量数据来说是不可能的。)我们还隐含地假设数据是作为我们打算存储的流生成的。(在数据固定的情况下,本题所陈述的问题将毫无意义,因为可以说整个数据一劳永逸地排列好了,问题就结束了。但是我们假设数据是有流动的,在这种情况下,采用最佳方式对数据进行排序非常重要)

上面提到的 Apache parquet 库的优点之一是我们可以确定输出 parquet 文件的确切大小。我认为这是一个优点。因为,例如,如果我知道 Hadoop 块的大小等于 128 MB,而 parquet 行组的大小为 128 MB,我可以将 parquet 文件大小固定为 1 GB。然后我知道所有镶木地板文件将有 8 个块,并且 HDFS 存储将得到最好的利用,并且所有镶木地板文件将相同。(因为在HDFS中,当块大小为128 MB时,较小的文件将占用相同的空间)这可能不是每个人的优势,如果需要的话,我们很乐意有经验的人批评它。

Parquet 文件排序挑战

在我们开始之前的一点是,我们正在寻找永久数据排序,因为我们将在接下来的数千个查询中使用它。几乎到目前为止,上面的描述已经确定了排序的一些挑战,但我将在下面描述所有挑战:

  1. Parquet 工具不允许您写入排序数据。因此一种方法是将所有数据保存在内存中,排序后将其交给 parquet 库写入 parquet 文件中。这种方法有两个缺点:1)不可能将所有数据保存在内存中。2) 因为所有数据都在内存中,所以 parquet 文件的大小未知,并且写入后可能小于或大于 1 GB 或任何数量,并且失去了固定 parquet 大小的优势。
  2. 假设我们想在并行过程中进行排序,而不是实时和流式进行。这样,如果我们想使用parquet库,我们仍然会遇到必须将整个数据带到内存中进行排序的问题,这是不可能的。假设我们使用 Spark 这样的工具进行排序。本节我们给出的一个具体成本是集群资源用于排序,实际中每个数据都被写入两次。(一次 parquet 写入时间和一次排序)下一点是,即使我们跳过这两种情况,在对数据进行排序后,根据 parquet 文件中的其他列,该特定列的 parquet …

sorting apache-spark parquet parquet-mr

7
推荐指数
0
解决办法
3846
查看次数

带有可自定义内容的Windows 10 UWP UserControl

我想在Windows 10 UWP中使用更改内容进行用户控制.

我知道如何进行简单的用户控件,但我需要一个像这样的用户控件:

<Controls:UserControl x:Name="Usercontrol1" Margin="0,10,0,0" Grid.Row="1">
    <Controls:UserControl.MainContent>
        <Grid x:Name="Content">
            //Items are here
        </Grid>
    </Controls:UserControl.MainContent>
</Controls:UserControl>
Run Code Online (Sandbox Code Playgroud)

我的用户控件中的Grid是空的,我想在每个页面中为此网格提供不同的项目.我想要一种方法在页面中为我的用户控件设置网格,然后将此网格添加到我的用户控件而不是那个空网格.

有没有办法做到这一点?

c# uwp

5
推荐指数
1
解决办法
3824
查看次数

在 Java 中生成任意长度的任意随机数

如何在 Java 中生成任意长度的任意随机数?比如,要生成一个宽度为3的数字,应该在100到999之间。那么如何编码呢?
在下图中:
描述
我想解决第二个问题。
这是我写的第一个问题:

public int getRandomNumberReturntypediff(int min,int max) {
    Random rand = new Random();

    int  n = rand.nextInt(1000) + 1;
    Integer.toString(n);

    System.out.println("get Random Number with return type STRING" + n);
    return n;
}
Run Code Online (Sandbox Code Playgroud)

假设我带参数length并返回String。我怎样才能做到这一点?

java

5
推荐指数
1
解决办法
4451
查看次数

反转浮点数 C

我正在学习 C。我们使用scanfprintf作为输入和输出数据。
我们课程中有一个问题:反转浮点数。

我的编程能力很好,我可以轻松地做到这一点。
例如,我的想法之一是将一个float数字转换为int10 的幂,然后将其反转并float再次转换。还有很多其他的想法。

但我们的问题有一个限度。使用scanf功能来反转数字。

我请老师给我一个代码。他给出了下面的代码。抱歉,因为我不太清楚代码。此代码给出 12.33 的 12 和 33,但此代码不适用于 12.00001,因为我们得到 12 和 1。当我们得到这个数字时,我们将它们反转并打印出来。我的老师问我解决这个问题的方法,但我找不到方法。没有必要存在某种方式,但是可以帮助我吗?

我的老师代码:

int main(){
    int a,b;
    scanf("%d.%d", &a, &b);
    printf("a = %d, b = %d", a, b);
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

c

0
推荐指数
1
解决办法
5184
查看次数

标签 统计

apache-spark ×1

c ×1

c# ×1

java ×1

parquet ×1

parquet-mr ×1

sorting ×1

uwp ×1