如何实现Spark select-explode成语?

时间:2016-06-26 12:16:00

标签: apache-spark apache-spark-sql

假设我们有一个DataFrame,其字符串列为col1,数组列为col2。我想知道在Spark操作中幕后发生了什么:

df.select('col1', explode('col2'))

似乎select将一系列Column个对象作为输入,explode返回Column所以类型匹配。但是explode('col2')返回的列在逻辑上与col1的长度不同,所以我想知道select在构造其输出DataFrame时如何知道“同步”它们。我试着查看Column课程的线索但是找不到任何东西。

1 个答案:

答案 0 :(得分:6)

答案很简单 - 没有Column这样的数据结构。虽然Spark SQL使用列式存储进行缓存,并且可以利用数据布局进行某些低级操作,但列只是数据和转换的描述而不是数据容器。因此explode上的flatMap是另一个Dataset[Row],因此简化了一点 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView ==null) { convertView = mInflater.inflate(R.layout.onlinelist,parent,false); holder = new ViewHolder(); holder.tv = (TextView) convertView.findViewById(R.id.textView1); holderProfile = (ImageView) convertView.findViewById(R.id.usernameProfile); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv.setText(usersInRange.get(position)); String[] split = usersInRange.get(position).split(" "); final String firstSubString = split[0]; AsyncHttpClient client = new AsyncHttpClient(); client.get("xxxxxxxxx.com/uploads/" + firstSubString + ".jpeg", null, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { final Bitmap image = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length); holderProfile.setImageBitmap(image); holderProfile.invalidate(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } }); return convertView; }