从rdd objectfile创建数据框

时间:2015-06-01 06:37:22

标签: java scala apache-spark

从RDD创建ddf的方法是什么,该RDD保存为objectfile。我想加载RDD,但我没有java对象,只有一个我想用作ddf模式的结构类型。

我尝试检索为行

    <!DOCTYPE html>
    <html>
    <body>

    <p id="demo">Click the button to get your position.</p>

    <button onclick="getLocation()">Try It</button>

    <div id="mapholder"></div>

    <script src="http://maps.google.com/maps/api/js?sensor=false"></script>

    <script>
    var x = document.getElementById("demo");
    setInterval(function(){showPosition();},1000);
    function getLocation() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition, showError);
        } else { 
            x.innerHTML = "Geolocation is not supported by this browser.";
        }
    }

    function showPosition(position) {
    navigator.geolocation.getCurrentPosition(showPosition, showError);
        lat = position.coords.latitude;
        lon = position.coords.longitude;
        latlon = new google.maps.LatLng(lat, lon)
        mapholder = document.getElementById('mapholder')
        mapholder.style.height = '250px';
        mapholder.style.width = '500px';

        var myOptions = {
        center:latlon,zoom:14,
        mapTypeId:google.maps.MapTypeId.ROADMAP,
        mapTypeControl:false,
        navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}
        }

        var map = new google.maps.Map(document.getElementById("mapholder"), myOptions);
        var marker = new google.maps.Marker({position:latlon,map:map,title:"You are here!"});
    }

    function showError(error) {
        switch(error.code) {
            case error.PERMISSION_DENIED:
                x.innerHTML = "User denied the request for Geolocation."
                break;
            case error.POSITION_UNAVAILABLE:
                x.innerHTML = "Location information is unavailable."
                break;
            case error.TIMEOUT:
                x.innerHTML = "The request to get user location timed out."
                break;
            case error.UNKNOWN_ERROR:
                x.innerHTML = "An unknown error occurred."
                break;
        }
    }
    </script>

    </body>
    </html>

但是我得到了

  

java.lang.ClassCastException:[Ljava.lang.Object;无法施展   org.apache.spark.sql.Row

有没有办法做到这一点。

修改

根据我的理解,我必须将rdd作为对象数组读取并将其转换为行。如果有人能为此提供方法,那就可以了。

2 个答案:

答案 0 :(得分:1)

如果你有一个Object of Array,你只需要对Any数组使用Row apply方法。在代码中将是这样的:

nuget restore "../path/to/solution.sln" -ConfigFile "nuget.config"

修改

你是@ user568109,这将创建一个只有一个字段的Dataframe,它将是一个解析整个数组的数组,你必须这样做:

val myrdd = sc.objectFile[Array[Object]]("/home/bipin/"+name).map(x => Row(x))

正如@ user568109所说,还有其他方法可以做到这一点:

val myrdd = sc.objectFile[Array[Object]]("/home/bipin/"+name).map(x => Row.fromSeq(x.toSeq))

无论你是哪一个都是因为两者都是相同代码的包装器:

val myrdd = sc.objectFile[Array[Object]]("/home/bipin/"+name).map(x => Row(x:_*))

答案 1 :(得分:0)

让我补充一些解释,

假设您有一个包含3列(项目,类别,价格)的mysql表杂货,其内容如下所示

+------------+---------+----------+-------+
| grocery_id | item    | category | price |
+------------+---------+----------+-------+
|          1 | tomato  | veg      |  2.40 |
|          2 | raddish | veg      |  4.30 |
|          3 | banana  | fruit    |  1.20 |
|          4 | carrot  | veg      |  2.50 |
|          5 | apple   | fruit    |  8.10 |
+------------+---------+----------+-------+
5 rows in set (0.00 sec)

现在,在想要阅读的内容中,您的代码将如下所示

val groceryRDD = new JdbcRDD(sc, ()=> DriverManager.getConnection(url,uname,passwd), "select item,price from grocery limit ?,?",1,10,2,r => r.getString("item")+"|"+r.getString("price"))

注意: 在上面的语句中,我将ResultSet转换为字符串 r =&gt; r.getString( “项目”)+ “|” + r.getString( “价格”)

所以我的JdbcRDD将是

groceryRDD: org.apache.spark.rdd.JdbcRDD[String] = JdbcRDD[29] at JdbcRDD at <console>:21

现在你保存它。

groceryRDD.saveAsObjectFile("/user/cloudera/jdbcobject")

回答您的问题

在读取您需要编写的目标文件时,如下所示

val newJdbObjectFile = sc.objectFile[String]("/user/cloudera/jdbcobject")

以盲目方式,只需替换您正在保存的RDD类型参数

在我的情况下,groceryRDD的类型参数为String,因此我使用了相同的

<强>更新

在你的情况下,如jlopezmat所述,你需要使用数组[对象]

此处 RDD的每一行都是对象,但由于您使用ObjectArray进行了转换,每一行及其内容将再次保存为数组,

即,在我的情况下,如果保存在RDD以上,

val groceryRDD = new JdbcRDD(sc, ()=> DriverManager.getConnection(url,uname,passwd), "select item,price from grocery limit ?,?",1,10,2,r => JdbcRDD.resultSetToObjectArray(r))

当我读同样使用和收集数据时

val newJdbcObjectArrayRDD = sc.objectFile[Array[Object]]("...")
val result = newJdbObjectArrayRDD.collect

结果将是 Array [Array [Object]]

类型
result: Array[Array[Object]] = Array(Array(raddish, 4.3), Array(banana, 1.2), Array(carrot, 2.5), Array(apple, 8.1))

您可以根据列定义解析上述内容。

如果它回答了您的问题,请告诉我