从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作为对象数组读取并将其转换为行。如果有人能为此提供方法,那就可以了。
答案 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))
您可以根据列定义解析上述内容。
如果它回答了您的问题,请告诉我