"""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
返回DataFrame的第一条记录
print(df.first())
如果想得到里面的内容,可以直接在后面["列名"]或者用asDIct()转成字典,使用字段的方法来查询
"""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)
"""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等聚合函数只能应用在数值类型的列上
上面的groupBy可以i用小写的groupby来替换
返回DataFrame前n行数据,默认是返回1行,可以通过n关键字参数指定
之前的first()方法底层就是调用的head(),该方法使用很简单,大家自行尝试吧
返回两个DataFrame的交集.A集合中(1,2,3,4) B集合中(2,3,4,5) AB交集(2,3,4)
"""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()
df.join(df1,"id","full_outer").select("id",df["name"],df1["name"],df["grade1"]).show()
注意,这里select中id,没有像后面的df["id"]的原因,是因为这里的id可以理解成经过join之后,id的地址已经不是df["id"]原有的了,这时候会出现匹配缺失的情况.
所以为了避免这种异常情况,关联字段可以用字符串,其他的例如上面的name字段可以用df["name"],df1["name"]的方式来区分.另外,可以将两个DF注册成临时表,采用sql语句的方式来实现,这样选取字段和别名处理都是很方便的..个人比较推崇采用SQL的方式来代替这种算子方式.
"""Limits the result count to the number specified."""
限制返回的数据的条数,防止返回到driver节点的数据过大造成OOM.该函数返回的还是DF对象
df.limit(1).show()
"""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的方法,对于空值的处理,以后会单独篇幅讲解,这里了解即可
本质就是sort方法.返回按照指定列排好序的新的DataFrame
df.show()
df.orderBy("grade1",ascending=True).show()
df.withColumn("grade1",df["grade1"].cast("int")).orderBy("grade1",ascending=True).show()
小心数据类型这个陷阱.如果是不改变成数值类型,会按照字典序排序...
使用ascending关键字参数指定升降序排列。除了这种方式,还可以通过
df.orderBy(df["grade1"].asc()).show()
注意asc后面的()不能省略...
用来指定DataFrame 的缓存级别,默认为内存和磁盘
"""Prints out the schema in the tree format.""""
以树形结构的形式打印出DataFrame的schame信息
df.printSchema()
"""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()
"""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())
因为是字符串类型的id,所以是多个拼接
使用给定的名字把当前的DataFrame注册成为一个临时的表.底层就是之前讲述过的createOrReplaceTempView方法.
了解即可,推荐使用createOrReplaceTempView