如何连接两个DataFrame并在spark中有条件地替换一列

时间:2016-12-04 15:42:53

标签: sql scala join apache-spark

有两个数据帧。为简单起见,我把它们如下:

DataFrame1

.controller('MyCtrl', function($scope,$timeout) {
$scope._printBarCode = function(printSectionId) {

    var innerContents = document.getElementById(printSectionId).innerHTML;
    var popupWindow = window.open('', 'Print');

    popupWindow.document.write('<!DOCTYPE html><html><head><style type="text/css">@media print { body { -webkit-print-color-adjust: exact; } }</style><link rel="stylesheet" type="text/css" href="barcode.css" media="all" /></head><body> ' + innerContents + '</body></html>');
    $timeout(function() {
        popupWindow.focus();
        popupWindow.print();
        popupWindow.close();
    });
};

DataFrame2

<input type="button" value="Prnt" ng-click="_printBarCode('barCodeId')" class="btn btn-primary" />
<div id="barCodeId" class="barcodeplace">
    <div class="col-sm-12">
        <div barcode-generator="{{_barCodeGeneraterId}}" style="height:20px;">
        </div>
    </div>
</div>

我想加入id | name ----------- 0 | Mike 1 | James 上的两个DataFrame,只保留 DataFrame1 中的列id | name | salary ------------------- 0 | M | 10 1 | J | 20 2 | K | 30 ,如果没有相应的id,则保留原始列name DataFrame2

应该是:

id

到目前为止,我只知道如何通过以下方式加入两个数据帧:

id | name  | salary
--------------------
0  | Mike  |  10
1  | James |  20
2  | K     |  30

但它会使用null来忽略名称值&#34; K&#34;。

谢谢!

1 个答案:

答案 0 :(得分:2)

替换空值,您可以使用DataFrameNaFunctions,如下所示......

    df1.join(df2, df1("id")===df2("id"), "left_outer")
.select(df2("id"), df1("name"), df2("salary"))
.na.fill(ImmutableMap.of("name", "unknown")).show()

其中'unknown'是样本值。你可以用你想要的价值取代......

如果您不希望行具有空值列

val joined = df1.join(df2, df1("id")===df2("id"), "left_outer")
    .select(df2("id"), df1("name"), df2("salary"))

val final = joined.where(joined.col("name").isNotNull)
final.show()

另请注意,正如@Tzach Zohar中提到的那样 def coalesce(e: Column*)功能

  

返回非空的第一列,如果所有输入都为null,则返回null   空。

如果您正在寻找那种......那么您可以继续。