如何在pyspark中按列名映射值

时间:2019-12-26 15:39:04

标签: python dataframe hive pyspark

我想要的-是将列名映射到键中。 例如:

#+-------+----------+
#|key1   |key2      |
#+-------+----------+
#|value1 |value2    |
#|value3 |value4    |
#+-------+----------+

将被转换为

#+-------+----------+
#|   keys|values    |
#+-------+----------+
#|key1   |value1    |
#|key1   |value2    |
#|key2   |value3    |
#|key2   |value4    |
#+-------+----------+

在HiveQL中,我可以写类似于

select distinct key, velue
    from xxx
    lateral view explode(map(
            'key1', key1,
            'key2', key2) tab as key, value

但是如何在pyspark上写它。 我可以使用createtemptable,但我认为这不是最佳解决方案/

2 个答案:

答案 0 :(得分:2)

使用create_map函数创建一个Map列,然后将其爆炸。

tick需要一组分组的列表达式 作为键值对。可以使用DataFrame列上的内容来创建这样的列表:

private Firebase_Database DbOnline;
ArrayList<ClassModel> clsList;



clsList = DbOnline.getClassesList();//return arraylist containing objects ...





//Implementation of getClassesList() in Firebase_Database CLASS..

public ArrayList<ClassModel> getClassesList(){//upto to this every thing execute but from here the //execution jumps to if(condition) line below...and I get null arraylist in return

        FbDb.child("Classes").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for(DataSnapshot ds: dataSnapshot.getChildren())
                {
                    ClassModel classModel = ds.getValue(ClassModel.class);
                    classModels.add(classModel);
                    Log.i("Tag", "Msg");
                }
                Log.i("Tag", String.valueOf(classModels.size()));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        if (classModels==null){
            Log.i("TAG","Null NO DATA IN DATABASE");
        }
        return classModels;
    }

答案 1 :(得分:1)

类似的东西?

select 'key1' as keys,
       key1 as values
from xxx
union all 
select 'key2' as keys,
       key2 as values
from xxx

投入spark.sql()