Spark Sql 源码剖析(二): TreeNode

Spark Sql 源码剖析(二): TreeNode,第1张

使用 object CurrentOrigin 为 TreeNodes 提供一个可以查找上下文的地方,比如当前正在解析哪行 code。

object CurrentOrigin 主要包含一个 private val value = new ThreadLocal[Origin]() ,目前 CurrentOrigin 仅在 parser 中使用,在 visit 每个节点的时候都会使用,记录当前 parse 的节点是哪行哪列

另外,从 value 是 ThreadLocal 类型可以看出,在 Spark SQL 中,parse sql 时都是在单独的 thread 里进行的(不同的 sql 不同的 thread)

返回该节点的 seq of children,children 是不可变的。有三种情况:

查找第一个符合 f 条件(比如某个类型的)的 TreeNode,先序遍历。

将函数 f 递归应用于节点及其子节点

与 foreach 不同的是,foreach 先应用于 parent,再应用与 child;而 foreachUp 是先应用于 child 再应用与 parent

调用 foreach,foreach 中应用的函数是 ret += f(_) ,最终返回一个 seq,包含将 f 通过 foreach 方式应用于所有节点并 add 到 ret。其中 f 本身是 BaseType => A 类型

原理与 map 一致,只是 f 变成了 BaseType => TraversableOnce[A]

PartialFunction#lift :将 partial func 转换为一个返回 Option 结果的函数。将 pf 函数应用于符合 pf 定义的节点(即 pflift(node)返回的 Option 不是 None )并都 add 到 ret = new collectionmutableArrayBuffer[B] 以 Seq 形式返回

以 Seq 的形式返回 tree 的所有叶子节点

def collectFirst[B](pf: PartialFunction[BaseType, B]): Option[B] :注意,因为可能没有符合 pf 定义的节点,所有返回的 Option 可能是 None

相当于 productIteratormap(f)toArray ,即对于 productIterator 每个元素执行 f 然后将 ret 组成一个 arr 返回

注意:TreeNode 没有实现 Product 相关方法,都由其子类自行实现

使用 new children 替换并返回该节点的拷贝。该方法会对 productElement 每个元素进行模式匹配,根据节点类型及一定规则进行替换。

调用 transformDown

rule: PartialFunction[BaseType, BaseType]

返回 f 应用于所有子节点(非递归,一般将递归 *** 作放在调用该函数的地方)后该节点的 copy。其内部的原理是调用 mapProductIterator,对每一个 productElement(i) 进行各种模式匹配,若能匹配上某个再根据一定规则进行转换,核心匹配转换如下:

以上都是适用于有 children 的 node,如果是 children 为 null 的 node 直接返回

反射生成节点副本

返回该类型 TreeNode 的 name,默认为 class name;注意,会移除物理 *** 作的 Exec$ 前缀

所有应该以该节点内嵌套树表示的 nodes,比如,可以被用来表示 sub-queries

(children ++ innerChildren)toSet[TreeNode[_]]

主要用于交互式 debug,返回该 tree 指定下标的节点,num 可以在 numberedTreeString 找到。最终调用的

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻: >

data 是你查找数据库sql语句的返回结果 ,应该是一个数组

d 从你print出来的来看 是一个 元组

d[0],就是取d里的第一个元素

保存数据:

ret = []

retappend(d)#d为你想要保存的数据

给你一个获得单值的类:(其中的

strconn是你的数据库连接字符串)////

/// <summary>

/// 从数据库中检索单个非数值型数据

/// </summary>

/// <author name="sky"></author>

/// <createtime value="2002/08/03"></createtime>

/// <param name="strSQL"></param>

/// <returns></returns>

public static string GetStr(string strSQL)

{

string strTmp="";

OleDbConnection objConn = new OleDbConnection(strConn);

OleDbCommand objCmd = objConnCreateCommand();

objCmdCommandText = strSQL;

objCmdCommandType = CommandTypeText;

objConnOpen();

strTmp = ConvertToString(objCmdExecuteScalar());

objConnClose();

return strTmp;

}

////

/// <summary>

///从数据库中检索单个数值型数据

/// </summary>

/// <author name="sky"></author>

/// <createtime value="2002/08/03"></createtime>

/// <param name="strSQL"></param>

/// <returns></returns>

public static int GetInt(string strSQL)

{

int intTmp;

OleDbConnection objConn = new OleDbConnection(strConn);

OleDbCommand objCmd = objConnCreateCommand();

objCmdCommandText = strSQL;

objCmdCommandType = CommandTypeText;

objConnOpen();

intTmp = ConvertToInt32(objCmdExecuteScalar()==null0:objCmdExecuteScalar());

objConnClose();

return intTmp;

}

/// <summary>

///从数据库中检索单个数值型数据

/// </summary>

/// <param name="strSQL"></param>

/// <returns></returns>

public static long GetLong(string strSQL)

{

long nRet;

OleDbConnection objConn = new OleDbConnection(strConn);

OleDbCommand objCmd = objConnCreateCommand();

objCmdCommandText = strSQL;

objCmdCommandType = CommandTypeText;

objConnOpen();

nRet = ConvertToInt64(objCmdExecuteScalar());

objConnClose();

return nRet;

}

以上就是关于Spark Sql 源码剖析(二): TreeNode全部的内容,包括:Spark Sql 源码剖析(二): TreeNode、如何在组态王里删除某一条ACCESS数据库里的记录,不是删除所有、python3.4:date和d是什么类型d和d[0]有什么区别,怎样把数据库中的数据保存在数组、list或元组里面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9590601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存