在 parquet 文件顶部从 pyspark 代码创建一个表

Posted

技术标签:

【中文标题】在 parquet 文件顶部从 pyspark 代码创建一个表【英文标题】:Create a table from pyspark code on top of parquet file 【发布时间】:2017-04-11 13:42:08 【问题描述】:

我正在使用peopleDF.write.parquet("people.parquet")in PySpark 代码将数据写入parquet 文件格式。现在我想要做的是,我想从相同的代码在这个parquet 文件之上创建一个table,然后我可以稍后从中查询。我该怎么做?

【问题讨论】:

什么表?您可以将该镶木地板加载到 DataFrame。将其注册为临时表并使用 sparkSQL 运行查询。或者告诉我们您如何运行查询? @YuriyNedostup 我想要的是根据我编写的镶木地板文件创建一个配置单元表。我不想要临时表 您的 parquet 文件是否存储在 HDFS 中? @lurriNedostup 是的,镶木地板文件在 hdfs 中 【参考方案1】:

您可以使用saveAsTable method:

peopleDF.write.saveAsTable('people_table')

【讨论】:

但这就是将数据框保存为表格,而不是在镶木地板文件的顶部创建表格【参考方案2】:

你必须像这样在hive 中创建外部表:

CREATE EXTERNAL TABLE my_table (
    col1 INT,
    col2 INT
) STORED AS PARQUET
LOCATION '/path/to/';

/path/to/ 是 HDFS 中文件的绝对路径。

如果你想使用分区,你可以添加PARTITION BY (col3 INT)。在这种情况下,要查看数据,您必须执行 repair

【讨论】:

谢谢!我知道,但如何从 pyspark 代码执行此操作? 您不必这样做。只要确保文件在目录中。每次添加新数据时,您都必须执行修复并使元数据无效才能看到更改。您可以在命令行中通过 hive 或使用 sqlWorkbench 等工具查询您的表 啊,你可以试试这个:***.com/questions/36051091/…。创建表后,您可以通过 HiveContext 加载它 我想通过pyspark代码来做是因为我想自动化创建表步骤,这样我就不必手动运行创建表命令。一旦创建了镶木地板文件,代码就会在该镶木地板文件的顶部创建表格 好吧,你可能有你自己的原因:) 我不会那样做。 pyspark 可能有一些功能可以做到这一点,但我不知道。我能看到的一种解决方案是从 DataFrame 中提取模式,将其转换为 SQL 语句并使用 HiveContext 的 sql 函数运行。

以上是关于在 parquet 文件顶部从 pyspark 代码创建一个表的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 同时编写 parquet 文件

Pyspark 在读取目录中的所有 parquet 文件时失败,但在单独处理文件时成功

从目录读取镶木地板文件时,pyspark不保存

在 PySpark 中指定最大 Parquet 块大小

读取 PySpark 中的所有分区 parquet 文件

pyspark write.parquet() 创建一个文件夹而不是 parquet 文件