为什么“plain_dictionary”编码的字典页偏移量为 0?

2024-04-03

parquet由Spark v2.4 Parquet-mr v1.10生成

n = 10000
x = [1.0, 2.0, 3.0, 4.0, 5.0, 5.0, None] * n
y = [u'é', u'é', u'é', u'é', u'a', None, u'a'] * n

z = np.random.rand(len(x)).tolist()
dfs = spark.createDataFrame(zip(x, y, z), schema=StructType([StructField('x', DoubleType(),True),StructField('y', StringType(), True),StructField('z', DoubleType(), False)]))
dfs.repartition(1).write.mode('overwrite').parquet('test_spark.parquet')

Using parquet-toolsv1.12 检查

row group 0 
--------------------------------------------------------------------------------
x:  DOUBLE SNAPPY DO:0 FPO:4 SZ:1632/31635/19.38 VC:70000 ENC:RLE,BIT_PACKED,PLAIN_DICTIONARY ST:[min: 1.0, max: 5.0, num_nulls: 10000]
y:  BINARY SNAPPY DO:0 FPO:1636 SZ:864/16573/19.18 VC:70000 ENC:RLE,BIT_PACKED,PLAIN_DICTIONARY ST:[min: a, max: é, num_nulls: 10000]
z:  DOUBLE SNAPPY DO:0 FPO:2500 SZ:560097/560067/1.00 VC:70000 ENC:PLAIN,BIT_PACKED ST:[min: 2.0828331581679294E-7, max: 0.9999892375625329, num_nulls: 0]

    x TV=70000 RL=0 DL=1 DS: 5 DE:PLAIN_DICTIONARY
    ----------------------------------------------------------------------------
    page 0:                   DLE:RLE RLE:BIT_PACKED VLE:PLAIN_DICTIONARY ST:[min: 1.0, max: 5.0, num_nulls: 10000] SZ:31514 VC:70000

    y TV=70000 RL=0 DL=1 DS: 2 DE:PLAIN_DICTIONARY
    ----------------------------------------------------------------------------
    page 0:                   DLE:RLE RLE:BIT_PACKED VLE:PLAIN_DICTIONARY ST:[min: a, max: é, num_nulls: 10000] SZ:16514 VC:70000

    z TV=70000 RL=0 DL=0
    ----------------------------------------------------------------------------
    page 0:                   DLE:BIT_PACKED RLE:BIT_PACKED VLE:PLAIN ST:[min: 2.0828331581679294E-7, max: 0.9999892375625329, num_nulls: 0] SZ:560000 VC:70000

问题:

FPO(第一个数据页偏移量)是否应该始终大于或小于 DO(字典页偏移量)?我从某处读到字典页存储在数据页之后。

对于柱x & y, plain_dictionary用于编码。但是,为什么两列的字典偏移量都是 0?

如果我使用 pyarrow v0.11.1 进行检查,它使用 parquet-cpp v1.5.1,它会告诉我has_dictionary_page: False & dictionary_page_offset: None

它有词典页吗?


第一个数据页的偏移量总是大于字典的偏移量。换句话说,字典首先出现,然后是数据页。有两个元数据字段用于存储这些偏移量:dictionary_page_offset(又名 DO)和data_page_offset(又名 FPO)。 不幸的是,parquet-mr 没有正确填写这些元数据字段。

例如,如果字典从偏移量 1000 开始,第一个数据页从偏移量 2000 开始,则正确的值将是:

  • dictionary_page_offset = 1000
  • data_page_offset = 2000

相反,镶木地板先生商店

  • dictionary_page_offset = 0
  • data_page_offset = 1000

应用于您的示例,这意味着尽管 parquet-tools 显示DO: 0,列 x 和 y 仍然是字典编码的(列 z 不是)。

值得一提的是,Impala 正确遵循规范,因此您不能依赖每个存在此缺陷的文件。

这是 parquet-mr 在读取过程中处理这种情况的方式:

// TODO: this should use getDictionaryPageOffset() but it isn't reliable.
if (f.getPos() != meta.getStartingPos()) {
  f.seek(meta.getStartingPos());
}

where getStartingPos定义为:

/**
 * @return the offset of the first byte in the chunk
 */
public long getStartingPos() {
  long dictionaryPageOffset = getDictionaryPageOffset();
  long firstDataPageOffset = getFirstDataPageOffset();
  if (dictionaryPageOffset > 0 && dictionaryPageOffset < firstDataPageOffset) {
    // if there's a dictionary and it's before the first data page, start from there
    return dictionaryPageOffset;
  }
  return firstDataPageOffset;
}

您可以在此处的上下文中看到这些代码行:ParquetFileReader.readDictionary https://github.com/apache/parquet-mr/blob/master/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java#L1010, ColumnChunkMetaData.getStartingPos https://github.com/apache/parquet-mr/blob/master/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/metadata/ColumnChunkMetaData.java#L148.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“plain_dictionary”编码的字典页偏移量为 0? 的相关文章

随机推荐

  • 具有固定大小的 Blackberry VerticalFieldManager:滚动问题

    我试图拥有一个带有修复标题 带有某些字段的管理器 和可滚动内容 自定义字段列表 的全屏用户界面 这个想法是模拟一种可滚动列表 为此 我制作了一个接受 maxHeight 屏幕高度 标题高度 的自定义 VerticalFieldManager
  • NSPopover 内的 NSTableview 看起来与独立的不同

    我创建了一个ListView类 这是一个非常简单的Tableview 如果我用 IB 实例化它 一切看起来都很好 如果我以编程方式实例化它也是一样 如果我在一个内部以编程方式实例化它NSPopover 我的桌子的每一行都有浅灰色背景 这是从
  • 为什么 form.submit() 不起作用?

    我在页面中有以下片段 我一生都无法弄清楚为什么单击button1元素时表单没有提交 我在 IE 中收到错误消息 指出该对象不支持此属性或方法 我将 document poform 放入警报中 它会警报表单对象 我感觉我可能错过了一些非常明显
  • 某些设备上的 Android 中出现“没有这样的表”问题

    我在 Android 应用程序中使用外部数据库 它在所有模拟器和三星真实设备上运行良好 但是当我检查宏碁智能手机时 我的应用程序崩溃并出现以下异常 android database sqlite SQLiteException no suc
  • 可变结构与类?

    我不确定是否使用可变结构或可变类 我的程序存储一个包含很多对象的数组 我注意到使用类会使所需的内存量增加一倍 但是 我希望对象是可变的 并且有人告诉我使用可变结构是邪恶的 这就是我的类型 struct or class Block publ
  • 将 Flash (AS3) 数据保存为 XML

    我在互联网上 包括 Stack Overflow 花了好几个小时 试图找到一个可靠的 可行的示例 将 Flash 中的信息保存到 XML 文件中 我想获取两种不同类型对象的位置并将每个对象的列表导出到 XML 我们将调用这些对象ball a
  • PHP 5.3.3 中的 ini_set("memory_limit") 根本不起作用

    我之前有过这样的工作 echo ini get memory limit n ini set memory limit 256M echo ini get memory limit n 这将输入 32M 256M 在通过命令行执行的 php
  • 如何在 C# HttpClient 中循环调用分页 URL 以从 JSON 结果下载所有页面

    我的第一个问题 所以请友善 我正在使用C HttpClient调用作业 API 端点 这是端点 Jobs API Endpoint 不需要密钥 点击即可 http service dice com api rest jobsearch v1
  • 如何延迟连接流?

    我正在尝试实现一个在其实现中使用其自身的另一个实例的流 该流前面有一些常量元素 使用 IntStream concat 因此只要串联流惰性地创建非常量部分 这应该就可以工作 我认为使用StreamSupport intStream 重载采用
  • 使用 ThreadPool Python 时的最大池大小

    我正在使用 ThreadPool 来实现多处理 使用多处理时 池大小限制应等于 CPU 核心数 我的问题 使用 ThreadPool 时 池大小限制应该是 CPU 核心数吗 这是我的代码 from multiprocessing pool
  • 外键为空 - 性能下降

    我有一个表文件夹 其中列parent id 引用id 如果该文件夹有父级 如果没有 则parent id 为空 这是好的解决方案还是我需要额外的表来进行此连接或其他解决方案 外键是否可以为空 如果可以 这个解决方案将有更长的执行时间 tab
  • 无法访问 Axios 拦截器内的 Vuex 存储突变

    EDIT 这个问题非常混乱 所以我基本上用相同的代码示例和相同的场景重写它 当服务器发送 401 错误响应时 我试图 commit从拦截器到我的 vuex 存储 import axios from axios import store fr
  • 用于查看特定端口的命令行

    有没有办法从 Windows 命令行检查特定端口的状态 我知道我可以使用 netstat 检查所有端口 但 netstat 很慢 并且查看特定端口可能不会 这里是简单的解决方案端口查找 In cmd netstat na find 8080
  • 在 Visual Studio 2015 中哪里可以找到 Microsoft.TeamFoundation.Build.Client?

    我有一个干净的 Windows 安装 仅安装了 Visual Studio 2015 并且我正在寻找 Microsoft TeamFoundation Build Client 程序集 我想知道它现在是否已随着即将推出的 vNext Bui
  • 如何将Python数据类转换为字符串文字字典?

    给定一个如下所示的数据类 class MessageHeader BaseModel message id uuid UUID def dict self kwargs return json loads self json 我想在调用时获
  • 每个进程的最大线程数 - sysconf(_SC_THREAD_THREADS_MAX) 失败

    我试图找到 UNIX 机器上每个进程的最大线程数 并编写下面的代码来使用 sysconf include
  • 如何追踪“libc++abi.dylib:调用了纯虚函数!”在Xcode中

    我有一个混合使用 C Objective C 和 Swift 的多线程 OS X 应用程序 当我的应用程序关闭时 我在 Xcode 调试器窗口中看到以下内容 libc abi dylib Pure virtual function call
  • python/pandas/一维数据框

    创建二维数据框效果很好 y np array 1 2 3 4 df pd DataFrame y index 1 2 columns a b print df 但是如果我尝试创建一维数据框 我会收到一条错误消息 z np array 5 6
  • 如何检查ngIf是否生效

    我在做什么我有一个隐藏 显示的组件 ngIf基于简单的布尔值 当组件变得可见时 我想将焦点应用于其模板中的子元素 问题如果我翻转布尔值 组件会正确显示 但如果我尝试使用以下命令获取对子元素的引用this elRef nativeElemen
  • 为什么“plain_dictionary”编码的字典页偏移量为 0?

    parquet由Spark v2 4 Parquet mr v1 10生成 n 10000 x 1 0 2 0 3 0 4 0 5 0 5 0 None n y u u u u u a None u a n z np random rand