HIVE 字段级血缘分析 写入Neo4j

本文介绍了如何通过Hive的LineageLogger Hook获取字段级血缘信息,然后清洗并存储到Neo4j数据库中。详细步骤包括配置Hive参数、解析日志、使用Neo4j查询依赖关系,并提供了API示例用于前端展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Step 1. 利用HIVE Hook LineageLogger 获取字段之间的依赖关系

注意:LineageLogger Hook 是Hive2.0版本之后存在的,如果HIVE版本不够需要升级HIVE版本。PS.CDH有的HIVE版本添加此功能

下面以hive 2.5.3版本为例

添加参数
vim /usr/local/hive/conf/hive-site.xml
<property>
    <name>hive.exec.post.hooks</name>
    <value>org.apache.hadoop.hive.ql.hooks.LineageLogger</value>
</property>
配置hook输出
vim ${HIVE_HOME}/conf/hive-log4j2.properties
og4j.logger.org.apache.hadoop.hive.ql.hooks.LineageLogger=INFO

输出位置在 hive-log4j2.properties 的 property.hive.log.dir 参数

测试输出
hive> desc test_table;
OK
c1                  	string
c2                  	bigint
c3                  	int

hive> select c1, max(c2) as max_c2 from test_table group by c1;

hive.log 日志输出如下
hive.log
JSON格式化如下

{
   
   
	"edges": [{
   
   
		"sources": [2],
		"targets": [0],
		"edgeType": "PROJECTION"
	}, {
   
   
		"sources": [3],
		"targets": [1],
		"expression": "max(ods.test_table.c2)",
		"edgeType": "PROJECTION"
	}],
	"vertices": [{
   
   
		"id": 0,
		"vertexType": "COLUMN",
		"vertexId": "c1"
	}, {
   
   
		"id": 1,
		"vertexType": "COLUMN",
		"vertexId": "max_c2"
	}, {
   
   
		"id": 2,
		"vertexType": "COLUMN",
		"vertexId": "ods.test_table.c1"
	}, {
   
   
		"id": 3,
		"vertexType": "COLUMN",
		"vertexId": "ods.test_table.c2"
	}]
}

比如edges中第二条 sources [3], targets [1]
代表 ods.test_table.c2 到 max_c2

参考文章 利用LineageLogger分析HiveQL中的字段级别血缘关系

Step 2. 利用已有的血缘log 清洗后存入 Neo4j

Neo4jUtil.py

from py2neo import Graph

class Neo4jUtil:
    def __init__(self, url, username, password):
        self.graph = Graph(url, auth=(username, password))

    def empty(self):
        self.graph.run("match (n) detach delete n")
    # 创建节点
    def create_column_node(self, node_name):
        match_result = self.graph.run("MATCH (a:Column) WHERE a.name = '%s' RETURN a" % node_name).data()
        if len(match_result) == 0:
            self.graph.run("CREATE (n:Column { name: '%s' })" % node_name)
    # 创建关系
    def create_column_relation(self, origin_name, dest_name):
        match_result = self.graph.run(
            "MATCH (a:Column)-[r:beDepColumn]->(b:Column) WHERE a.name = '%s' AND b.name = '%s' RETURN r" %
            (origin_name, dest_name)).data()
        if len(match_result) == 0:
            self.g
### 表别数据血缘关系在Neo4j中的建模与写入 #### 1. 数据模型设计 为了有效地表示表别的数据血缘关系,在 Neo4j 中可以采用节点和边相结合的方式进行建模。具体来说: - **节点(Node)**:代表各个数据库表,属性包括但不限于表名、所属库名称等基本信息。 - **边(Relationship)**:用来描述不同表格之间的依赖关系或转换操作,携带有关处理逻辑的信息。 这种结构能够清晰展示各张表之间是如何相互关联并影响彼此的数据流动情况[^2]。 ```cypher // 创建表节点示例 CREATE (hive_table:HiveTable {name:'orders', database:'ecommerce'}) CREATE (spark_table:SparkTable {name:'order_items', database:'sales'}) // 建立两表间的关系,假设订单明细由订单派生而来 MATCH (source:HiveTable{name:'orders'}), (target:SparkTable{name:'order_items'}) MERGE (source)-[:GENERATES]->(target) ``` #### 2. ETL过程集成 对于已经存在的历史血缘信息,可通过ETL工具定期抽取元数据变更记录,并将其转化为Cypher语句批量导入至图数据库内;而对于新增的任务,则可以在执行前动态生成相应的CQL命令完成即时同步更新[^1]。 ```bash # 使用sqoop或其他工具导出MySQL中所有表结构定义为JSON文件 $ sqoop export ... # Python脚本读取上述json并将之转成neo4j可接受格式 import json from py2neo import Graph graph = Graph("http://localhost:7474", auth=("username","password")) with open('tables.json') as f: tables = json.load(f) for table in tables: cypher_query = "MERGE (t:{engine} {{ name : '{table_name}', schema :'{schema}'}})".format( engine=table['type'], table_name=table['tableName'], schema=table.get('schema','default') ) graph.run(cypher_query) # 如果存在父表则创建关系 parent_tables = table.get('parentTables',[]) for p in parent_tables: rel_cypher="MATCH (p),(c) WHERE c.name='{child}' AND p.name='{parent}' MERGE (p)-[:FEEDS_INTO]->(c)" graph.run(rel_cypher.format(child=table['tableName'],parent=p)) ``` #### 3. 查询优化建议 考虑到大规模企业环境下可能涉及数万甚至数十万个对象实例及其复杂交错的关系网络,在实际部署过程中需特别注意索引设置以提高查询效率。针对频繁访问的关键路径上的标签(Label),应考虑为其添加唯一约束或者全文检索能力来加速特定场景下的遍历速度[^5]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值