使用 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,先序遍历。
与 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或元组里面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)