SQLFlow:在线解析SQL血缘关系(SQL Data Lineage)

网站:SQLFlow

什么是血缘关系

当你在数据库里执行一段SQL代码后,数据库会返回给你一个结果集(record set,简称RS),结果集中的每一列可能来源于不同的表,这些不同的表又依赖别的表,中间可能经过了函数、聚合等计算。源表与结果集关系,就是血缘关系。

例如,有这样的SQL语句,从源表user和order中,查询了一个用户所有订单金额的RS:

-- mysql
SELECT `user`.name,
       `order`.price
FROM   `user`,
       `order`
WHERE  `user`.id = `order`.uid 

他的血缘关系如下图所示:

 

如果我们的金额只取整数,他的关系图如下:

-- mysql
SELECT `user`.name,
       floor(`order`.price) as price
FROM   `user`,
       `order`
WHERE  `user`.id = `order`.uid 

 

可以看到,和上图相比,price在形成结果之前,经历了floor函数的计算。

我们可以user.id和order.uid之间的join关系列出来:

 

我们从上面的表中,我们做一个子查询,对于每个人取金额最大的:

-- mysql
SELECT temp.name, max(temp.price) as price 
FROM (
  SELECT `user`.name,
         `order`.price
  FROM   `user`,
         `order`
  WHERE  user.id = order.uid 
 ) as temp
GROUP BY temp.name

 

可以看到,和上面的图相比,多个一个叫RESULT_OF_TEMP的表,他就是我们子查询形成的中间结果,他也出现在我们的血缘关系中。

在线解析

打开网站SQLFlow,注册一个用户, 切换选择数据库,输入sql代码,点击visualize按钮:

 

 

在图像空白区域点击右键,可以下载图片:

 

 

点击visualize join按钮,切换jon视图:

 

 

切换到setting面板,可以设置是否显示中间过程,是否显示函数:

 

 

其他选项,请自行探索。

参考

  1. Collect data lineage in Data Warehouses by analysis SQL script

  2. The basic concept of the dataflow

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取DataWorks中节点的字段血缘关系,您可以使用DataWorks OpenAPI来查询相关信息。以下是一个示例的Java代码,用于获取节点的字段血缘关系: ```java import com.aliyun.dataworks.openapi.client.ApiException; import com.aliyun.dataworks.openapi.client.DefaultOpenApiClient; import com.aliyun.dataworks.openapi.client.OpenApiClient; import com.aliyun.dataworks.openapi.client.auth.CredentialsProvider; import com.aliyun.dataworks.openapi.client.auth.StaticCredentialsProvider; import com.aliyun.dataworks.openapi.client.config.ClientConfiguration; import com.aliyun.dataworks.openapi.client.constant.CommonConstants; import com.aliyun.dataworks.openapi.client.constant.RequestConstant; import com.aliyun.dataworks.openapi.client.constant.ResponseConstant; import com.aliyun.dataworks.openapi.client.model.ProjectBaseInfo; import com.aliyun.dataworks.openapi.client.model.TableEntity; import com.aliyun.dataworks.openapi.client.model.TableFieldEntity; import com.aliyun.dataworks.openapi.client.model.TableLineageEntity; import com.aliyun.dataworks.openapi.client.model.TableLineageListEntity; import java.util.ArrayList; import java.util.List; public class DataWorksFieldLineageExample { public static void main(String[] args) { // DataWorks账号信息 String accessKeyId = "<AccessKeyId>"; String accessKeySecret = "<AccessKeySecret>"; // DataWorks接口地址 String endpoint = "<DataWorksEndpoint>"; // 项目信息 Long projectId = <ProjectId>; // 节点信息 Long nodeId = <NodeId>; // 创建OpenApiClient CredentialsProvider credentialsProvider = new StaticCredentialsProvider(accessKeyId, accessKeySecret); ClientConfiguration config = new ClientConfiguration(endpoint); OpenApiClient client = new DefaultOpenApiClient(credentialsProvider, config); try { // 获取项目信息 ProjectBaseInfo projectInfo = client.getProjectById(projectId); // 获取节点信息 TableEntity tableEntity = client.getTableEntity(projectId, nodeId); // 获取字段信息 List<TableFieldEntity> fields = tableEntity.getFields(); // 获取字段血缘关系 List<TableLineageEntity> lineageList = new ArrayList<>(); for (TableFieldEntity field : fields) { TableLineageListEntity lineage = client.getTableFieldLineage(projectId, nodeId, field.getFieldName()); lineageList.add(lineage.getLineage()); } // 处理字段血缘关系数据 for (TableLineageEntity lineage : lineageList) { String fieldName = lineage.getFieldName(); List<TableLineageEntity> ancestors = lineage.getAncestors(); List<TableLineageEntity> descendants = lineage.getDescendants(); // TODO: 处理字段血缘关系数据 // 示例:打印字段的上游和下游节点信息 System.out.println("字段名称: " + fieldName); System.out.println("上游节点: " + ancestors); System.out.println("下游节点: " + descendants); System.out.println(); } } catch (ApiException e) { // 处理异常 e.printStackTrace(); } } } ``` 请根据实际情况替换代码中的占位符,并根据您的需求进行适当的处理和扩展。这个示例代码使用了DataWorks OpenAPI的Java SDK来获取节点的字段血缘关系,并对结果进行了简单的处理和打印。您可以根据自己的业务需求对字段血缘关系数据进行进一步处理和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值