备注:此博客为转载,原作者地址请点击此处
RDD、DataFrame和DataSet的区别
<!-- 作者区域 -->
<div class="author">
<a class="avatar" href="/u/92a1227beb27">
<img src="//upload.jianshu.io/users/upload_avatars/1212395/372f1407ba8d.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">
<!-- 文章内容 -->
<div data-note-content="" class="show-content">
<div class="show-content-free">
<p><strong>spark 2.X开始,三者的关系发生了变化,可以参考<a href="http://www.infoq.com/cn/articles/three-apache-spark-apis-rdds-dataframes-and-datasets" target="_blank" rel="nofollow">《且谈Apache Spark的API三剑客:RDD、DataFrame和Dataset》</a> ,在2.X中DataFrame=DataSet[Row],其实是不知道类型。下面介绍是1.X,以免误导大家。</strong></p>
RDD、DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同。
RDD和DataFrame
上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。
提升执行效率
RDD API是函数式的,强调不变性,在大部分场景下倾向于创建新对象而不是修改老对象。这一特点虽然带来了干净整洁的API,却也使得Spark应用程序在运行期倾向于创建大量临时对象,对GC造成压力。在现有RDD API的基础之上,我们固然可以利用mapPartitions方法来重载RDD单个分片内的数据创建方式,用复用可变对象的方式来减小对象分配和GC的开销,但这牺牲了代码的可读性,而且要求开发者对Spark运行时机制有一定的了解,门槛较高。另一方面,Spark SQL在框架内部已经在各种可能的情况下尽量重用对象,这样做虽然在内部会打破了不变性,但在将数据返回给用户时,还会重新转为不可变数据。利用 DataFrame API进行开发,可以免费地享受到这些优化效果。
减少数据读取
分析大数据,最快的方法就是 ——忽略它。这里的“忽略”并不是熟视无睹,而是根据查询条件进行恰当的剪枝。
上文讨论分区表时提到的分区剪 枝便是其中一种——当查询的过滤条件中涉及到分区列时,我们可以根据查询条件剪掉肯定不包含目标数据的分区目录,从而减少IO。
对于一些“智能”数据格 式,Spark SQL还可以根据数据文件中附带的统计信息来进行剪枝。简单来说,在这类数据格式中,数据是分段保存的,每段数据都带有最大值、最小值、null值数量等 一些基本的统计信息。当统计信息表名某一数据段肯定不包括符合查询条件的目标数据时,该数据段就可以直接跳过(例如某整数列a某段的最大值为100,而查询条件要求a > 200)。
此外,Spark SQL也可以充分利用RCFile、ORC、Parquet等列式存储格式的优势,仅扫描查询真正涉及的列,忽略其余列的数据。
执行优化
为了说明查询优化,我们来看上图展示的人口数据分析的示例。图中构造了两个DataFrame,将它们join之后又做了一次filter操作。如果原封不动地执行这个执行计划,最终的执行效率是不高的。因为join是一个代价较大的操作,也可能会产生一个较大的数据集。如果我们能将filter下推到 join下方,先对DataFrame进行过滤,再join过滤后的较小的结果集,便可以有效缩短执行时间。而Spark SQL的查询优化器正是这样做的。简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程。
得到的优化执行计划在转换成物 理执行计划的过程中,还可以根据具体的数据源的特性将过滤条件下推至数据源内。最右侧的物理执行计划中Filter之所以消失不见,就是因为溶入了用于执行最终的读取操作的表扫描节点内。
对于普通开发者而言,查询优化 器的意义在于,即便是经验并不丰富的程序员写出的次优的查询,也可以被尽量转换为高效的形式予以执行。
RDD和DataSet
DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式被存储,不需要反序列化就可以执行sorting、shuffle等操作。
DataSet创立需要一个显式的Encoder,把对象序列化为二进制,可以把对象的scheme映射为Spark SQl类型,然而RDD依赖于运行时反射机制。
通过上面两点,DataSet的性能比RDD的要好很多,可以参见[3]
DataFrame和DataSet
Dataset可以认为是DataFrame的一个特例,主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row。因此具有如下三个特点:
DataSet可以在编译时检查类型
并且是面向对象的编程接口。用wordcount举例:
val ds = sqlContext.read.text("/home/spark/1.6/lines" ).as[String ] val result = ds .flatMap(.split(" " )) .filter( != “” ) .toDF() .groupBy(
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
v
a
l
u
e
"
<
/
s
p
a
n
>
)
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
c
o
m
m
e
n
t
"
>
/
/
C
o
u
n
t
n
u
m
b
e
r
o
f
o
c
c
u
r
e
n
c
e
s
o
f
e
a
c
h
w
o
r
d
<
/
s
p
a
n
>
.
a
g
g
(
c
o
u
n
t
(
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
∗
"
<
/
s
p
a
n
>
)
a
s
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
n
u
m
O
c
c
u
r
a
n
c
e
s
"
<
/
s
p
a
n
>
)
.
o
r
d
e
r
B
y
(
<span class="hljs-string">"value"</span>) <span class="hljs-comment">// Count number of occurences of each word</span> .agg(count(<span class="hljs-string">"*"</span>) as <span class="hljs-string">"numOccurances"</span>) .orderBy(
< s p a n c l a s s = " h l j s − s t r i n g " > " v a l u e " < / s p a n > ) < s p a n c l a s s = " h l j s − c o m m e n t " > / / C o u n t n u m b e r o f o c c u r e n c e s o f e a c h w o r d < / s p a n > . a g g ( c o u n t ( < s p a n c l a s s = " h l j s − s t r i n g " > " ∗ " < / s p a n > ) a s < s p a n c l a s s = " h l j s − s t r i n g " > " n u m O c c u r a n c e s " < / s p a n > ) . o r d e r B y ( “numOccurances” desc)
val wordCount =
ds.flatMap(_.split(" " ))
.filter(_ != "" )
.groupBy(_.toLowerCase())
.count()
后面版本DataFrame会继承DataSet,DataFrame是面向Spark SQL的接口。
DataFrame和DataSet可以相互转化,df.as[ElementType]
这样可以把DataFrame转化为DataSet,ds.toDF()
这样可以把DataSet转化为DataFrame。
参考
[1] Spark SQL结构化分析
[2] 解读2015之Spark篇:新生态系统的形成
[3] Introducing Spark Datasets
[4] databricks example
</div>
</div>
</div>
<!-- 如果是付费文章,未购买,则显示购买按钮 -->
<!-- 连载目录项 -->
<!-- 如果是付费文章 -->
<!-- 如果是付费连载,已购买,且作者允许赞赏,则显示付费信息和赞赏 -->
<div id="free-reward-panel" class="support-author"><p>小礼物走一走,来简书关注我</p> <div class="btn btn-pay">赞赏支持</div> <div class="supporter"><ul class="support-list"></ul> <!----></div> <!----> <!----></div>
<div class="show-foot">
<a class="notebook" href="/nb/3044371">
<i class="iconfont ic-search-notebook"></i>
<span>spark</span>
© 著作权归作者所有
<!-- 文章底部作者信息 -->
<div class="follow-detail">
<div class="info">
<a class="avatar" href="/u/92a1227beb27">
<img src="//upload.jianshu.io/users/upload_avatars/1212395/372f1407ba8d.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96" alt="96">
关注 jacksu在简书
写了 65379 字,被 1325 人关注,获得了 591 个喜欢
Talk is cheap, show me the code!
分布式框架、大数据、机器学习
github: https://github.com/jacksu
<div class="meta-bottom">
<div data-v-6ddd02c6="" class="like"><div data-v-6ddd02c6="" class="btn like-group"><div data-v-6ddd02c6="" class="btn-like"><a data-v-6ddd02c6="">喜欢</a></div> <div data-v-6ddd02c6="" class="modal-wrap"><a data-v-6ddd02c6="">46</a></div></div> <!----></div>
<div class="share-group">
<a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
<i class="iconfont ic-wechat"></i>
</a>
<a class="share-circle" data-action="weibo-share" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=1881139527',u=z||d.location,p=['&url=',e(u),'&title=',e(t||d.title),'&source=',e(r),'&sourceUrl=',e(l),'&content=',c||'gb2312','&pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','', '推荐 @jacksu_ 的文章《RDD、DataFrame和DataSet的区别》( 分享自 @简书 )','https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo','页面编码gb2312|utf-8默认gb2312'));" data-original-title="分享到微博">
<i class="iconfont ic-weibo"></i>
</a>
<a class="share-circle" data-toggle="tooltip" id="longshare" target="_blank" data-original-title="" title="">
<div class="qrcode" id="qrcode">
<img src="//cdn2.jianshu.io/assets/web/download-index-side-qrcode-cb13fc9106a478795f8d10f9f632fccf.png" alt="Download index side qrcode">
<p>下载app生成长微博图片</p>
</div>
<i class="iconfont ic-picture"></i>
</a>
<a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
<ul class="share-list">
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url='+e('https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=qzone')+'&title='+e('推荐 jacksu在简书 的文章《RDD、DataFrame和DataSet的区别》'),x=function(){if(!window.open(r,'qzone','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-zone"></i><span>分享到QQ空间</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://twitter.com/share?url='+e('https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=twitter')+'&text='+e('推荐 jacksu在简书 的文章《RDD、DataFrame和DataSet的区别》( 分享自 @jianshucom )')+'&related='+e('jianshucom'),x=function(){if(!window.open(r,'twitter','toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-twitter"></i><span>分享到Twitter</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://www.facebook.com/dialog/share?app_id=483126645039390&display=popup&href=https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=facebook',x=function(){if(!window.open(r,'facebook','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-facebook"></i><span>分享到Facebook</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,r='https://plus.google.com/share?url='+e('https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=google_plus'),x=function(){if(!window.open(r,'google_plus','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();"><i class="social-icon-sprite social-icon-google"></i><span>分享到Google+</span></a></li>
<li><a href="javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:'',r='http://www.douban.com/recommend/?url='+e('https://www.jianshu.com/p/c0181667daa0?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=douban')+'&title='+e('RDD、DataFrame和DataSet的区别')+'&sel='+e(s)+'&v=1',x=function(){if(!window.open(r,'douban','toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330'))location.href=r+'&r=1'};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()"><i class="social-icon-sprite social-icon-douban"></i><span>分享到豆瓣</span></a></li>
</ul>
" data-original-title="" title="">更多分享</a>
</div>
</div>
<a id="web-note-ad-1" target="_blank" href="/apps/redirect?utm_source=note-bottom-click"><img src="//cdn2.jianshu.io/assets/web/web-note-ad-1-c2e1746859dbf03abe49248893c9bea4.png" alt="Web note ad 1"></a>
<!--
<div id="note-comment-above-ad-container">
<span id="youdao-comment-ad" class="ad-badge">广告</span>
</div>
-->
<div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/avatar_default-78d4d1f68984cd6d4379508dd94b4210.png"></a> <div class="sign-container"><a href="/sign_in?utm_source=desktop&utm_medium=not-signed-in-comment-form" class="btn btn-sign">登录</a> <span>后发表评论</span></div></form> <!----></div> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="normal-comment-list" class="normal-comment-list"><div><div><div class="top-title"><span>14条评论</span> <a class="author-only">只看作者</a> <a class="close-btn" style="display: none;">关闭评论</a> <div class="pull-right"><a class="active">按时间倒序</a><a class="">按时间正序</a></div></div></div> <!----> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="comment-30623259" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/327b42343412" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/9217271/d634d19d-61b3-4d83-9e7b-0251e25e4f63?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/327b42343412" target="_blank" class="name">Northern_9f84</a> <!----> <!----> <div class="meta"><span>7楼 · 2018.11.13 14:20</span></div></div></div> <div class="comment-wrap"><p>mark,感谢</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-30623259" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-19767371" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/f3e8c58ae25d" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/1778843/3c51d48b53b9?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/f3e8c58ae25d" target="_blank" class="name">下班儿去看书</a> <!----> <!----> <div class="meta"><span>6楼 · 2018.01.20 12:21</span></div></div></div> <div class="comment-wrap"><p>反复看了几遍,写的很好</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-19767371" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-19929575" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/92a1227beb27" target="_blank">jacksu在简书</a>:
</div> <!----></div> <span><a href="/users/f3e8c58ae25d" class="maleskine-author" target="_blank" data-user-slug="f3e8c58ae25d">@下班儿去看书</a> 欢迎交流</span></p> <div class="sub-tool-group"><span>2018.01.25 00:38</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-6068097" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/c87b4f370446" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/3673675/2d1fcc1b-1b60-46e0-b2a8-8820de8f0cd4.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/c87b4f370446" target="_blank" class="name">Fang2016</a> <!----> <!----> <div class="meta"><span>5楼 · 2016.11.30 21:28</span></div></div></div> <div class="comment-wrap"><p>我有个疑问:<br>官网原文<br>A DataFrame is a Dataset organized into named columns. It is conceptually equivalent to a table in a relational database or a data frame in R/Python, but with richer optimizations under the hood. DataFrames can be constructed from a wide array of sources such as: structured data files, tables in Hive, external databases, or existing RDDs. The DataFrame API is available in Scala, Java, Python, and R. In Scala and Java, a DataFrame is represented by a Dataset of Rows. In the Scala API, DataFrame is simply a type alias of Dataset[Row]. While, in Java API, users need to use Dataset<Row> to represent a DataFrame.<br>其中两句:<br>DataFrame is represented by a Dataset of Rows<br>A DataFrame is a Dataset organized into named columns<br>意思是不是DataFrame是DataSet的子集,而不是DataSet是DataFrame的特例?</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-6068097" class="like-button"><span data-v-cdecbe24="">1人赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-7848599" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/e5b6e8325ff5" target="_blank">我真的真的很帅</a>:
</div> <!----></div> <span> <a href="/users/c87b4f370446" class="maleskine-author" target="_blank" data-user-slug="c87b4f370446">@Fang2016</a> 赞同你的理解</span></p> <div class="sub-tool-group"><span>2017.02.09 14:32</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div><div id="comment-2890626" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/1da1341ba178" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/1252690/c22435153adb?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/1da1341ba178" target="_blank" class="name">蝶影追梦</a> <!----> <!----> <div class="meta"><span>4楼 · 2016.06.26 09:57</span></div></div></div> <div class="comment-wrap"><p>您好,你提到,DataSet创立需要一个显式的Encoder。<br>这点不对吧,官网说到:encoders are code generated dynamically。</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-2890626" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list hide"><!----> <!----></div></div><div id="comment-2315532" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/7bdccac1f8dd" target="_blank" class="avatar"><img src="//cdn2.jianshu.io/assets/default_avatar/11-4d7c6ca89f439111aff57b23be1c73ba.jpg"></a> </div> <!----></div> <div class="info"><a href="/u/7bdccac1f8dd" target="_blank" class="name">mr_ly</a> <!----> <!----> <div class="meta"><span>3楼 · 2016.05.09 23:42</span></div></div></div> <div class="comment-wrap"><p>大神 请教一个问题啊 我用 dataframe读取了一个大概有200W行 2G的hive table 并与几个hive table 进行一系列join操作 最后 insert 到一张新hive里面 spark就跑不出来了 减少表的行数到 1W行 能够出结果 我想问问spark对机器的内存配置要求很高吗? 我的机器是在一台服务器上虚拟出来的 5台机器 每台机器 内存6G 这样配置还不行么?</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-2315532" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-2320785" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/92a1227beb27" target="_blank">jacksu在简书</a>:
</div> <!----></div> <span><a href="/users/7bdccac1f8dd" class="maleskine-author" target="_blank" data-user-slug="7bdccac1f8dd">@mr_ly</a> 这要看你的join复杂度,如果key重复比较多的话,应该join生成的表格比较大。</span></p> <div class="sub-tool-group"><span>2016.05.10 13:03</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2327170" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/7bdccac1f8dd" target="_blank">mr_ly</a>:
</div> <!----></div> <span><a href="/users/92a1227beb27" class="maleskine-author" target="_blank" data-user-slug="92a1227beb27">@jacksu_</a> 对了 想请问一下 dataframe 有update操作吗? 主要是想用另一张表的一些字段 跟新 update 这张表 我发现好像不能update 所以暂时是用join操作 把要更新的字段和这表连接 最后 select 出来 插入一张新表。。。</span></p> <div class="sub-tool-group"><span>2016.05.10 22:28</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div><div id="comment-2342934" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/92a1227beb27" target="_blank">jacksu在简书</a>:
</div> <!----></div> <span><a href="/users/7bdccac1f8dd" class="maleskine-author" target="_blank" data-user-slug="7bdccac1f8dd">@mr_ly</a> 最好举一个简单的例子</span></p> <div class="sub-tool-group"><span>2016.05.12 08:27</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <span class="line-warp">
还有2条评论,
<a>展开查看</a></span> <!----> <!----></div> <!----></div></div><div id="comment-2123702" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/1754e3486a09" target="_blank" class="avatar"><img src="//upload.jianshu.io/users/upload_avatars/1944513/77100324246b?imageMogr2/auto-orient/strip|imageView2/1/w/114/h/114/format/webp"></a> </div> <!----></div> <div class="info"><a href="/u/1754e3486a09" target="_blank" class="name">fisk</a> <!----> <!----> <div class="meta"><span>2楼 · 2016.04.21 18:08</span></div></div></div> <div class="comment-wrap"><p>哥,有更多的关于DataSet的讲解没 <img src="http://assets.jianshu.io/assets/emojis/smile.png" alt=":smile:" title=":smile:" class="emoji" width="20" height="20"> </p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-2123702" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-2180213" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="/u/92a1227beb27" target="_blank">jacksu在简书</a>:
</div> <!----></div> <span><a href="/users/1754e3486a09" class="maleskine-author" target="_blank" data-user-slug="1754e3486a09">@fisk</a> 谢谢支持,最近比较忙,后面有时间专门写写DataSet的应用。</span></p> <div class="sub-tool-group"><span>2016.04.26 21:44</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div></div></div> <!----> <div><!----></div></div></div>