【问题标题】:Transformation in spark data setspark数据集中的转换
【发布时间】:2018-05-16 23:40:48
【问题描述】:

我在 RDBMS 中的数据库表很少,在当前逻辑中,所有这些表都被连接并提供一些数据,基本上 SQL 存储为视图的一部分。 想通过使用 spark 数据集在 spark 中进行类似的转换, 现在我已经使用 sqoop 将数据推送到 HDFS,想要应用一些 group by 和 order by 操作。

什么可能是加入数据集的最佳方式,例如将所需的列转储到内存中(例如 df.registeredTempTable())并应用连接,或者我可以使用数据集连接,因为数据在 HDFS 的不同文件中可用。 请给我推荐一个好的方法。

问候 阿南特

【问题讨论】:

  • 为什么要在Hadoop环境下保持相同的表概念?我会转换创建 Avro 文档的数据,而不是“应用连接”。
  • 非常感谢您的回复。让我们说,我有员工表和部门表,使用 sqoop 作业,我已将两个表数据转储到 HDFS 中的单独文件夹中。现在要执行以下查询 SELECT department_name AS 'Department Name',COUNT(*) AS 'No of Employees' FROM部门 INNER JOIN employees ON employees.department_id =部门.department_id GROUP BY department.department_id, department_name ORDER BY department_name;能否请您详细说明一下 avro 文档。

标签: apache-spark dataset


【解决方案1】:

我建议走得更远一点。我不会选择在数据集之间进行连接。

我会遵循下一个方法:

  1. Sqoop 进程中涉及的所有表。
  2. 使用 Apache Spark 或 Apache Crunch 创建 Avro 文档。
  3. 将 Hive 表挂载到上一步创建的数据。

让我们来看看你提到的例子:

1. Sqoop 数据:您已经完成了这一步。

2。创建 Avro 文档

虚拟数据

Departament
id, name
1 Sales
2 Technology

Employers
id, department_id, name
1 1 John
2 1 Bruno
3 2 Alicia
4 2 George

文档的结构将取决于您将如何使用数据,可以是 2 个选项:

雇主

{"name": "John", "department": "Sales"}
{"name": "Bruno", "department": "Sales"}
{"name": "Alicia", "department": "Technology"}
{"name": "George", "department": "Technology"}

部门

{"name": "Sales", "Employers": ["John", "Bruno"]}
{"name": "Technology", "Employers": ["Alicia", "George"]}

这样查询就容易多了。

采用这种方法的好处是,当您的关系数据库模型包含太多表时,您的查询会变得更加复杂,而且,当表的大小太大时,在运行时连接数据是时候了昂贵,那是因为您想在 ETL 管道期间转换数据,而不是在运行时进行。

希望这能阐明方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2018-06-14
    • 2016-12-12
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多