PySpark---SparkSQL中的DataFrame(三)

1.filter(condition)

"""Filters rows using the given condition.
:func:`where` is an alias for :func:`filter`.
:param condition: a :class:`Column` of :class:`types.BooleanType`
    or a string of SQL expression."""

按照传入的条件进行过滤,其实where方法就是filter方法的一个别名而已。

不仅可以传入布尔表达式的方式,还可以直接把条件字符串用类似SQL语句中的筛选条件传入.

df.show()
df.filter("age>=12").show()
df.filter(df["grade2"] > 40).show() # 或者写成df.grade2

PySpark---SparkSQL中的DataFrame(三)_第1张图片

2.first()

返回DataFrame的第一条记录

print(df.first())

如果想得到里面的内容,可以直接在后面["列名"]或者用asDIct()转成字典,使用字段的方法来查询

3.foreach(f)

"""Applies the ``f`` function to all :class:`Row` of this :class:`DataFrame`.
This is a shorthand for ``df.rdd.foreach()``"""

在每一个Row上运用f方法,实际上它调用的是df.rdd.foreach这个RDD上的foreach方法

df.foreach(lambda x: print("id是: %s,年龄是: %s" % (x.id, x.age)))

还有一个foreachPartition方法,他是在整个分区上调用传入的f方法,效率比foreach方法更加高效,因为foreach方法是在每个Row上进行调用。

def print_func(partition_datas):
    for row in partition_datas:
        print("id is %s ,age is %s" % (row.id, row.age))


df.foreachPartition(print_func)

4.groupBy(*cols)

"""Groups the :class:`DataFrame` using the specified columns,
so we can run aggregation on them. See :class:`GroupedData`
for all the available aggregate functions.
:func:`groupby` is an alias for :func:`groupBy`.
:param cols: list of columns to group by.
    Each element should be a column name (string) or an expression (:class:`Column`)."""

使用给定的列进行分组,返回GroupedData对象,该对象上提供了许多对数据进行聚合的方法.

groupby这个方法实际上是groupBy这个方法的一个别名

这个方法涉及到GroupedData这种简单理解成分好组的DataFrame,该类中存在很多聚合方法,准备单独写一篇文章来讲述,这里暂时贴一些简单使用:

df.withColumn("grade1",df["grade1"].cast("int")).groupBy("id").avg("grade1").show()
# avg等聚合函数只能应用在数值类型的列上 

PySpark---SparkSQL中的DataFrame(三)_第2张图片

上面的groupBy可以i用小写的groupby来替换

5.head(n=None)

返回DataFrame前n行数据,默认是返回1行,可以通过n关键字参数指定

之前的first()方法底层就是调用的head(),该方法使用很简单,大家自行尝试吧

6.intersect(other)

返回两个DataFrame的交集.A集合中(1,2,3,4) B集合中(2,3,4,5) AB交集(2,3,4)

7.join(other, on=None, how=None)

"""Joins with another :class:`DataFrame`, using the given join expression.
:param other: Right side of the join
:param on: a string for the join column name, a list of column names,
    a join expression (Column), or a list of Columns.
    If `on` is a string or a list of strings indicating the name of the join column(s),
    the column(s) must exist on both sides, and this performs an equi-join.
:param how: str, default ``inner``. Must be one of: ``inner``, ``cross``, ``outer``,
    ``full``, ``full_outer``, ``left``, ``left_outer``, ``right``, ``right_outer``,
    ``left_semi``, and ``left_anti``."""

用来对两个DataFrame做连接关联操作,other是另 外一个DataFrame,on指定以哪个字段做关联,how指定怎么关联,有 inner, cross, outer, full, full_outer, left, left_outer, right, right_outer, left_semi, and left_anti选项,默认是inner。

df = spark.read.csv(r"C:\Users\asus\Desktop\in\test 1.csv",header=True)
df.show()
df1 = spark.read.csv(r"C:\Users\asus\Desktop\in\test 2.csv",header=True)
df1.show()
df.join(df1,"id","full_outer").show()

PySpark---SparkSQL中的DataFrame(三)_第3张图片

df.join(df1,"id","full_outer").select("id",df["name"],df1["name"],df["grade1"]).show()

PySpark---SparkSQL中的DataFrame(三)_第4张图片

注意,这里select中id,没有像后面的df["id"]的原因,是因为这里的id可以理解成经过join之后,id的地址已经不是df["id"]原有的了,这时候会出现匹配缺失的情况.

所以为了避免这种异常情况,关联字段可以用字符串,其他的例如上面的name字段可以用df["name"],df1["name"]的方式来区分.另外,可以将两个DF注册成临时表,采用sql语句的方式来实现,这样选取字段和别名处理都是很方便的..个人比较推崇采用SQL的方式来代替这种算子方式.

8.limit(num)

"""Limits the result count to the number specified."""

限制返回的数据的条数,防止返回到driver节点的数据过大造成OOM.该函数返回的还是DF对象

df.limit(1).show()

PySpark---SparkSQL中的DataFrame(三)_第5张图片

9.na

"""Returns a :class:`DataFrameNaFunctions` for handling missing values."""

返回 DataFrameNaFunctions 对象,用来处理na数据。注意:@property 

该类里面主要有:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'df', 'drop', 'fill', 'replace']

里面常用的方法'drop', 'fill', 'replace',,本质还是调用DataFrame的方法,对于空值的处理,以后会单独篇幅讲解,这里了解即可

10.orderBy(*cols, **kwargs)

本质就是sort方法.返回按照指定列排好序的新的DataFrame

df.show()
df.orderBy("grade1",ascending=True).show()
df.withColumn("grade1",df["grade1"].cast("int")).orderBy("grade1",ascending=True).show()

PySpark---SparkSQL中的DataFrame(三)_第6张图片

小心数据类型这个陷阱.如果是不改变成数值类型,会按照字典序排序...

使用ascending关键字参数指定升降序排列。除了这种方式,还可以通过

df.orderBy(df["grade1"].asc()).show()

注意asc后面的()不能省略...

11.persist(storageLevel=StorageLevel.MEMORY_AND_DISK)

用来指定DataFrame 的缓存级别,默认为内存和磁盘

PySpark---SparkSQL中的DataFrame(三)_第7张图片

12.printSchema()

"""Prints out the schema in the tree format.""""

以树形结构的形式打印出DataFrame的schame信息

df.printSchema()

PySpark---SparkSQL中的DataFrame(三)_第8张图片

13.randomSplit(weights, seed=None)

"""Randomly splits this :class:`DataFrame` with the provided weights.
:param weights: list of doubles as weights with which to split the DataFrame. Weights will
    be normalized if they don't sum up to 1.0.
:param seed: The seed for sampling."""

按照给定的权重将DataFrame分为几个 DataFrame,seed关键字参数用来指定随机种子,用于复现结果。结果返回一个DataFrame的列表

df.show()
# 注意[]中不能放入1,2这样的值,必须放入小数
dflist = df.randomSplit([1.0,2.0],100)
for one in dflist:
    one.show()

PySpark---SparkSQL中的DataFrame(三)_第9张图片

14.rdd

"""Returns the content as an :class:`pyspark.RDD` of :class:`Row`.""" 
 @property

返回DataFrame对应的RDD对象,利用这个对象可以调用RDD上的所有的方法,但是这些方法是比较底层的方法,在处理一些特殊任务的时候,顶层的DataFrame的方法可能无法解决,需要转换到更底层的RDD上来进行操作。

rdd = df.rdd

print(rdd.map(lambda x:x.id * 2).collect())

PySpark---SparkSQL中的DataFrame(三)_第10张图片

因为是字符串类型的id,所以是多个拼接

15.registerTempTable(name)

使用给定的名字把当前的DataFrame注册成为一个临时的表.底层就是之前讲述过的createOrReplaceTempView方法.

了解即可,推荐使用createOrReplaceTempView

你可能感兴趣的:(PySpark,Spark)