如何让空值不存储在 Pandas Python 中的 HBase 中?

Posted

技术标签:

【中文标题】如何让空值不存储在 Pandas Python 中的 HBase 中?【英文标题】:How to let null values are not stored in HBase in Pandas Python? 【发布时间】:2020-01-08 03:16:50 【问题描述】:

我有一些示例数据如下:

    test_a      test_b   test_c   test_d   test_date
    -------------------------------------------------
1   a           500      0.1      111      20191101
2   a           NaN      0.2      NaN      20191102
3   a           200      0.1      111      20191103
4   a           400      NaN      222      20191104
5   a           NaN      0.2      333      20191105

我想让那些数据存储在Hbase中,我使用下面的代码来实现它。

from test.db import impala, hbasecon, HiveClient
import pandas as pd

sql = """
    SELECT test_a
            ,test_b
            ,test_c
            ,test_d
            ,test_date
    FROM table_test
    """

conn_impa = HiveClient().getcon()
all_df = pd.read_sql(sql=sql, con=conn_impa, chunksize=50000)

num = 0

for df in all_df:
    df = df.fillna('')
    df["s"] = df["test_d"] + df["test_date"]
    tmp_num = len(df)
    if len(df) > 0:
        with hintltable.batch(batch_size=1000) as b:
            df.apply(lambda row: b.put(row["k"], 
                'test:test_a': str(row["test_a"]),
                'test:test_b': str(row["test_b"]),
                'test:test_c': str(row["test_c"]),
            ), axis=1)

            num += len(df)

当我在 Hbase get 'test', 'a201911012' 上查询时,我得到以下结果:

COLUMN                           CELL                                                                                         
 test:test_a                      timestamp=1578389750838, value=a                                                              
 test:test_b                      timestamp=1578389788675, value=                                                              
 test:test_c                      timestamp=1578389775471, value=0.2                                                              
 test:test_d                      timestamp=1578449081388, value=                                                           

Pandas Python 中如何确保空值不存储在 HBase 中?我们不需要 null 或空字符串值,我们的预期结果是:

COLUMN                           CELL                                                                                         
 test:test_a                      timestamp=1578389750838, value=a                                                                                                                       
 test:test_c                      timestamp=1578389775471, value=0.2                                                              

【问题讨论】:

【参考方案1】:

您应该能够通过创建一个自定义函数并在您的 lambda 函数中调用它来做到这一点。例如你可以有一个函数 -

def makeEntry(a, b, c):
    entrydict = 
    ## using the fact that NaN == NaN is supposed to be False and empty strings are Falsy
    if(a==a and a):
        entrydict ["test:test_a"] = str(a)
    if(b==b and b):
        entrydict ["test:test_b"] = str(b)
    if(c==c and c):
        entrydict ["test:test_c"] = str(c)
    return entrydict

然后您可以将您的应用功能更改为 -

df.apply(lambda row: b.put(row["k"],
makeEntry(row["test_a"],row["test_b"],row["test_c"])), axis=1)

这样您只输入不是NaN 的值,而不是所有值。

【讨论】:

非常感谢您的回答,我尝试了您的方法,但在dict["test:test_a"] = str(a) 中出现错误,TypeError: ("'type' object does not support item assignment", u'occurred at index 0') @nullfearless 哦,现在应该没问题了,我在重命名字典后没有更改所有变量名时搞砸了,它们都应该是entrydict 非常感谢,你拯救了我的一天,我刚刚发现我的数据中有 None 值,你知道如何忽略它们吗? 非常感谢. ??☕️☕️ 我可以使用if(a==a and a is not None) @nullfearless 函数应该忽略 None 值(除非它是 "None" 字符串),因为所有 None 值都是 Falsy 但是是的,你可以使用 if(a==a and a is not None)

以上是关于如何让空值不存储在 Pandas Python 中的 HBase 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mongoose中让空值排在最后?

SQL中建视图关联表的一个字段有空值,导致视图中的数据不完整,想让空值到视图中也是空值怎么整

如何使用空值将字符串转换为日期时间 - python,pandas?

Python 实战基础Pandas如何移除包含空值的行

如果列值不为 NULL,则 Python pandas 应用函数

Python机器学习(九十一)Pandas 填充(Imputation)空值