大数据开发遇坑大杂烩

本文用于记录开发过程中遇到得一些坑,可能涉及到得大数据工具包括Hive、Presto、Spark、Flink、ES、Hadoop等,解决方案包括自己研究和网络搬运

  1. PySpark中报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-11: ordinal not in range(128)
    在操作dataframe并调用show()时报错(非数据显示操作并不会报错),解决方案是在调用show()前添加
    reload(sys)
    sys.setdefaultencoding( "utf-8" )

     

  2. Presto查询报错: Query failed (#20191220_070151_03108_858gh): Corrupted statistics for column "[col_name] optional binary " in Parquet file。 原因是存储的parquet文件有部分是损坏的,而presto在0.216开始添加了一个文件完整性检测,这个默认是开启的,可以直接关掉 

    #全局关闭 :vim  catalog/hive.properties
    hive.parquet.fail-on-corrupted-statistics=false
    
    #在会话中关闭,在sql前添加配置,推荐此种方式 
    set session hive.parquet_fail_with_corrupted_statistics=false;

     

  3. Hive使用collect_set导致内部数据重排的问题

    HIVE_SQL= """
        SELECT collect_set(id) id_set, collect_set(word) word_set, log_date
        FROM test_table
        GROUP BY log_date
    """
    #执行sql并将结果传入下面的函数,发现打印出来的结果是错误的对应关系
    
    def collect_set_example(word_set, id_set):
        words = []
        for i in range(0, len(word_set)):
            if word_set[i] in content:
                print(word_set[i] + "--" + id_set[i])

    出现上面问题的原因是collect_set()会对集合内所有的元素进行去重和重排,导致多个集合相互关联到错误数据的情况
    解决的方法是使用collect_list(),数据去重可以拿到数据关联完再进行

  4. Hive查询数据出现数据显示错乱的问题

    出现错乱的原因是查询的字段中有的数据包含换行符"\n",而再Hive中的表默认使用LINES TERMINATED BY '\t'进行行分隔符,且不可修改,否则会报错。这导致hive显示数据错误的将一个字段的数据分隔到多行里去。
    解决方法是对可能出现换行符的字段提前进行清洗,将换行符替换成其它 如\t或空格

  5. Caused by: org.elasticsearch.hadoop.EsHadoopException: Could not write all entries for bulk operation [1/1000]. Error sample (first [5] error messages):org.elasticsearch.hadoop.rest.EsHadoopRemoteException: illegal_argument_exception: Document contains at least one immense term in field="content" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped.  Please correct the analyzer to not produce such terms. org.elasticsearch.hadoop.rest.EsHadoopRemoteException: max_bytes_length_exceeded_exception: max_bytes_length_exceeded_exception: bytes can be at most 32766 in length; got 40000
    原因:keyword类型的最大支持的长度为——32766个字节的UTF-8类型字符,而content插入了10000个中文字符
    解决:此对content进行了截取,限制字符数少于8000

你可能感兴趣的:(大数据)