将A列的一个值与Hive HQL中B列的所有值进行比较

时间:2018-04-17 07:35:33

标签: hive hiveql

我在一个表中有两列,比如列A和列B.我需要每次都使用列B的所有值搜索列A的每个值,如果在任何一个中找到列A值,则返回true列B的行。我怎么能得到这个?

我尝试使用以下命令:

select column _A, column_B,(if (column_A =column_B), True, False) as test from sample;

如果我使用上面的命令,它会单独检查该特定行。但是如果在列B的任何行中找到列A的值,我需要真值。 如何使用B列的所有值检查A列的一个值?

或者是否有可能迭代并比较两列之间的每个值?

2 个答案:

答案 0 :(得分:1)

解决方案

  

创建临时表t作为select,rand()作为id,column_A,column_B来自sample; - >参考1

     

从( - >参考3

中选择public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{ ArrayList<Scoreboard_Item> arrayList = new ArrayList<>(); public RecyclerAdapter(ArrayList<Scoreboard_Item> arrayList){ this.arrayList = arrayList; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent,false); MyViewHolder myViewHolder = new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.Username.setText(arrayList.get(position).getUsername()); holder.Team1.setText(arrayList.get(position).getTeam1()); holder.Team2.setText(arrayList.get(position).getTeam2()); holder.Sport.setText(arrayList.get(position).getSport()); holder.Status.setText(arrayList.get(position).getStatus()); } @Override public int getItemCount() { return arrayList.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { TextView Username, Team1, Team2, Sport, Status; //ImageView imageView; public MyViewHolder(View itemView) { super(itemView); //imageView =(ImageView) itemView.findViewById(R.id.imageView); Username = (TextView)itemView.findViewById(R.id.Username); Team1 = (TextView)itemView.findViewById(R.id.Team1); Team2 = (TextView)itemView.findViewById(R.id.Team2); Sport = (TextView)itemView.findViewById(R.id.Sport); Status = (TextView)itemView.findViewById(R.id.Status); } }} t3.id,t3.column_A,t3.column_B,t3.match
distinct
     

)t3;

解释

  1. 创建标识符列以跟踪原始表中的行。我在这里使用select t1.id as id, t1.column_A as column_A, t1.column_B as column_B,--> Refer 2 if(t2.column_B is null, False, True) as match from t t1 LEFT OUTER JOIN t t2 ON t1.column_A = t2.column_B 。我们将利用此功能获取步骤3中的原始行。在此处创建临时表rand()以简化后续步骤。
  2. 使用自己的t进行测试,要求所有行都匹配每列,并生成LEFT OUTER JOIN列。请注意,这里可能会创建多个重复行而不是match表,但我们已经掌握了重复项,因为它们的Sample列将是相同的。

  3. 在此步骤中,我们应用id来获取distinct表中的原始行。然后,您可以放弃Sample列。

  4. 注释

    1. 自我加入在性能方面成本很高,但这对解决问题是不可避免的。
    2. 步骤3中使用的id也很昂贵。一种更高效的方法是使用Window函数,我们可以通过distinct进行分区并选择窗口中的第一行。你可以探索一下。

答案 1 :(得分:0)

您可以对自己执行左连接并检查列键是否为空。如果为null,则在另一个表中找不到该值。使用if或“case when”函数来检查它是否为空。

Select t1.column_A,
          t1.column_B,
         IF(t2.column_B is null, 'False', 'True') as test
from Sample t1
Left Join Sample t2
On t1.column_A = t2.column_B;