parameters: (p, fields)
return_statement: return p.group_by(lambda record: _select_fields(record, fields),
              key_serde=get_serde_of_fields(p.serde(), fields, p.pipeline().default_objector()))
docstring: 按fields分组。
  
      Args:
          p (pcollection): 输入数据集，需要是一个每个元素都是dict的pcollection
          fields(str/[str]): 如果fields为一个str，则会按“,”进行切割，然后按切割出的字段进行分组。
                             如果fields为一个list，则直接按list中的多个字段进行分组。
  
      Returns:
          返回一个key为一个包含指定字段的dict，value为原数据集的PTable。
  
      需要注意的是，由于python原生的dict的key不能为dict，所以，这个返回的PTable上不能调用get操作，
      如果需要get结果，可以先调用flatten。
  
      例如：::
  
          >>> x = _pipeline.parallelize([{'a': 1, 'b': 2.0, 'c': 1},
          >>>                            {'a': 1, 'b': 2.0, 'c': 2},
          >>>                            {'a': 2, 'b': 1.0, 'c': 3},
          >>>                            ])
  
          >>> print (x.apply(fields.group_by, 'a, b')
          >>>         .apply_values(fields.agg,
          >>>                       'a,b,c=>a,b,c',
          >>>                       lambda a, b, c: (a.sum(), b.sum(), c.sum()))
          >>>         .apply(fields.flatten)
          >>>         .get()
          >>> )
  
          [{'a': 2, 'c': 3, 'b': 1.0}, {'a': 2, 'c': 3, 'b': 4.0}]
docstring_summary: 按fields分组。
docstring_tokens: 按fields分组。
function: def group_by(p, fields):
      """
      按fields分组。
  
      Args:
          p (pcollection): 输入数据集，需要是一个每个元素都是dict的pcollection
          fields(str/[str]): 如果fields为一个str，则会按“,”进行切割，然后按切割出的字段进行分组。
                             如果fields为一个list，则直接按list中的多个字段进行分组。
  
      Returns:
          返回一个key为一个包含指定字段的dict，value为原数据集的PTable。
  
      需要注意的是，由于python原生的dict的key不能为dict，所以，这个返回的PTable上不能调用get操作，
      如果需要get结果，可以先调用flatten。
  
      例如：::
  
          >>> x = _pipeline.parallelize([{'a': 1, 'b': 2.0, 'c': 1},
          >>>                            {'a': 1, 'b': 2.0, 'c': 2},
          >>>                            {'a': 2, 'b': 1.0, 'c': 3},
          >>>                            ])
  
          >>> print (x.apply(fields.group_by, 'a, b')
          >>>         .apply_values(fields.agg,
          >>>                       'a,b,c=>a,b,c',
          >>>                       lambda a, b, c: (a.sum(), b.sum(), c.sum()))
          >>>         .apply(fields.flatten)
          >>>         .get()
          >>> )
  
          [{'a': 2, 'c': 3, 'b': 1.0}, {'a': 2, 'c': 3, 'b': 4.0}]
  
      """
      if isinstance(fields, str):
          fields = ''.join(fields.split()).split(',')
      def _select_fields(dct, fields):
          return dict((field, dct[field]) for field in fields)
      return p.group_by(lambda record: _select_fields(record, fields),
              key_serde=get_serde_of_fields(p.serde(), fields, p.pipeline().default_objector()))
function_tokens: def group_by ( p , fields ) : if isinstance ( fields , str ) : fields = '' . join ( fields . split ( ) ) . split ( ',' ) def _select_fields ( dct , fields ) : return dict ( ( field , dct [ field ] ) for field in fields ) return p . group_by ( lambda record : _select_fields ( record , fields ) , key_serde = get_serde_of_fields ( p . serde ( ) , fields , p . pipeline ( ) . default_objector ( ) ) )